#技术方向的选择   在前面的章节中,已经了解了知识学习的生理原理、学习方法之后,在下面的三个小节中,我将和大家一起探讨作为程序员所要学习的内容,编程到底学什么?合适学些什么?   下面的部分分为3个小节,第1小节从技术趋势、个人条件、职业目标等方面来分析什么样的技术是合适的我们学习的。第2小节,分成了7个部分,以技术岗位为依据,介绍了今下编程各个可能的技术方向。第3个小节探讨在方向选择的基础上,如何进行技术方向的延伸和升级。并讨论了如何成为全栈工程师和架构师的话题。 ##选择方向   人之为人,做任何事情都是有目标和意义的,编写程序所需要的学习也不例外,所学的内容,得从我们学习的出发点谈起。   技术五花八门,以语言为例,就有C、C++、PHP、Java、Python、Ruby等,这些年Go、Swift、Scala也在兴起。种类也繁多,比如有浏览器前端的开发技术,服务器端的开发技术,大数据技术等,近些年又兴起了云计算、VR等,在每一个领域,程序员的工作虽然都简单地呼之为“编程”。但是这一个简单的词语之下,可能存在相当大的差别。因为即使是编程,也包罗甚广,牵扯到多个不同的技术方向、编程语言,进而由不同的技术方向、编程语言演化成了多种不同的职位。在每一个职位上,想成为专家,都至少要以3-5年以上的积累,按着《异类》的观点,要想在一个行业成为专家,必须有10000小时的积累。所以回过头来说,即使是在技术领域,想精于所有的内容,不太可能,哪怕是一个垂直领域,也不容易。既然不能全部来学,那首先学什么就要依据我们的目标而定了。   那什么是目标,怎么定目标呢?目标说得正式一点就是你的规划,甚至是职业规划。因为我们的大多数学习肯定都不是为学而学,应该想自己在学习了这门或者这类技术之后成一个什么样的人,如果你真只是兴趣来看看,本书估计也不是你想看的。这个目标会引导你来学习,不至于失去方向,也不至于被一些相干不相干的东西所诱惑。下面的阐述,我们首先来讲如何定目标,然后再探讨有关于技术的学习,讨论也围绕不同的目标而展开,对于初学者,选取其中一个目标来参考学习即可。   有人说,人的一生有7次机会,对你的人生路径进行选择,这个选择,大多是关于职业和成长的选择,而这每一步选择都至关重要,除了大的像高考、娶妻这样的选择之外,还有的小的像学什么编程方向、在哪里定居这样的选择。所以我们在面对程序员学什么这个话题的时候,不是一上来就抱着技术书开始啃了。这样的话,只会导致你关注当下,而忘记了你要前进的方向,有一句话说得好,方向比努力更重要,如果方向不对,努力也是白费的,并且越努力越白费,不是么?   而如何选择方向,这个得从两个大方面来说,第一个是大势,大势指的是国家大势、产业大势、技术趋势。第二个是个人的情况。个人的情况则是指个人的背景技能、知识以及兴趣、身体等方面,也包括家庭成长环境和相应经济状况,对于个人成长的期望。大势决定了应该选择的方向,个人决定了你是否适合于这一行,决定了你有多少资本付出。 ###大势   在人类的历史进程中,科学技术是推动社会发展的重要引擎,每一次的技术革新,人类发展都向前迈一大步,小到铁具发明、马蹬出现,拓展了人类能力的边界,大到蒸汽机、电力的出现,造就了一次又一次的工业革命,互联网时代,这是第三次工业革命,技术更成为第一生产力。但是正如历史发展所表明,技术会随着发展更新换代、迭代演进,有的永远进了博物馆,有的则一代又一代焕发光芒。在这长久的演进的过程中,每一种技术都有人追随,每一种技术也许都有过浪潮之巅的辉煌,也许都有过谷底的迷茫。相比历史的演进,人的生命是多么地短暂,渺小,在这种对比的过程中,我们选择哪种技术来追随,就成了一个需要慎之又慎的问题。所以本节,我们就探讨趋势,以让我们的选择是紧跟趋势,此之谓“识时务者为俊杰”。 ####国家大势   为什么把国家大势写在前面呢?因为产业和行业都是受国家政策引导的,国家是最大的环境因素,所以先需要认清的是国家政策和发展方向。比如比特币行业受到国内的管制较为严格,如果想以比特币为职业方向,研究比特币技术,是有相当风险的。当然,兴趣除外。正向的比如这些年创业,在国家这些层面得到了充分的重视,那么,在加入一个成熟的上市公司和一个快速发展中的创业公司而言,后者的投资回报率可能更大。所以,去关注重点行业的创业公司缺乏什么样的人才,自己做什么样的准备。 那现在的国家大势是什么呢?个人提一些看法,希望能对大家认清这块有所帮助。 * A、中国到目前,已不再是人口过剩和高速增长了,而是劳动人口在减少和经济增长速度减缓了 * B、大量行业存在产能过剩,存在大量不能适应经济发展和转型的就业人口 * C、大学里培养出来的人才,满足不了社会的需求。 * 所以可以看到相应的国家政策是: * A、放开二胎了,延迟退休(要增加适龄劳动人口)了 * B、GDP的目标变成范围(不能光追求一个数字)了 * C、要从刺激消费,变成供给侧改革(这个的意思是说产能过剩,不单单由于消费需求被压制,更大的原因是供给过剩)了 * D、要重视职业教育(之前是向人口数量要产出,现在要向人口质量要产出)了 如此等等,都是国家大势下国家政策的体现。 ####产业大势   了解完了国家政策,那么该进入什么样的大行业呢?勿庸置疑,本书是讨论程序员学习,肯定我们关注的也是程序员所能工作的行业,整个IT产业都有程序员能发挥作用的地方,那么是不是IT行业所有细分领域都值得我们去呢?肯定不是!比如信息化行业,软件行业,相比同互联网结合联密的互联网+行业,后者更值得我们去,举个例子,做钢铁信息化的公司与钢铁产业互联网的代表公司找钢网相比,后者更值得我们去关注。 下面讲几个可能正在转变的趋势。 * A、现在经济处于转型升级时期,各行各业都向互联网转型升级,产业互联网的转型大潮兴起了几年,尚未进入高潮,还有的是机会。 * B、不能向人口数量要产出了,要向人口质量要产出了,而人民生活水平提高,而第二胎也放开了,所以无论从幼教到兴趣教育到职业教育,都会有不错的机会。 * C、企业不能像过去那么粗放经营了,所以提高企业效能的手段都会产生价值,这就是近年B2B的SaaS逐渐兴起的原因。 * D、PC端的软件产业,比如ERP,管理系统,都会面临着向移动端的升级,君不见,钉钉、易快报等移动端办公软件崛起得非同寻常? * E、嵌入式行业也面临结合互联网和社交的再一级升级,这就是万物互联(IOT)的时代。如果选择行业,这些是我们应该关注的。 * F、还有一些行业,也正在兴起,比如机器人、人工智能、VR、AR,虽然行业早期进入有风险,但是代表了未来,而不是代表没落。   在选择行业和专业时,我们需要去关注这些领域,而不是光从自己目前所知所学出发,另外最好结合已有的优势,比如你在大学学的是一些相对来讲需要调整转型的专业,比如治金专业,你想进入互联网行业,可以考虑治金行业转型升级的机会,两不相扰。 ####技术趋势   光就编程技术而言,发展到今天也分为了几大体系,分别来做一个简单的了解,对这些体系的分类,是从各种不同的设备的开发应用上讲的。 * 1、操作系统和底层服务开发 这部分一般是C/C++ 占据了绝大部分市场,比如 Linux、Unix 操作系统、Nginx 服务器都是用 C 写的,而 MySQL 大量的代码基于C++ ,另外一些适合后端开发的语言,写底层服务也不在少数,比如Java、Go 等,像Docker是Go语言的项目,而Hadoop 则大部分代码基于 Java。 另外少部分服务,也基于Python、Node.js 等来编写,因为能快速地做出可用的原型。像Websocket 之类协议的服务器。 * 2、桌面端应用开发 三大桌面操作系统,Windows、Mac OSX、Linux 都有自己的开发技术和体系。其中 Windows 上的桌面应用开发,如果是Windows 原生的应用,大多集于微软自身的技术,包括 Visual C++(主要语言为C++,但是需要大量使用 Windows 上的SDK 和MFC 库)、Visual C#(编程语言为C#)、Visual Basic(编程语言为Basic) 等,当然也有一些相对没落的第三方开发工具,比如C++ Builder(主经编程语言为C++,同样有自己核心的VCL库)和Delphi(语言为 Object Pascal) 等。在Mac OSX 上,主流的当然是苹果官方的 Objective-C,后面会逐步地演进到推荐使用 Swift,开发的 IDE 也是官方的 Xcode。在 Linux 中, QT 和 GTK 开发是主流手段。QT一般是用C++语言,而GTK本身是C所写,编写桌面应用时调用它可以使用多种编程语言。比如C++,PHP, Guile,Perl, Python, TOM, Ada95, Objective C, Free Pascal, and Eiffel等。当然,话说回来,这些开发技术,并不是说在领域内严格地限定,比如C#,在Linux、Mac OSX 上有著名的Mono 开源项目,可以使用C#开发桌面应用,GTK 也同样移植到了Linux 之外的系统之中。这里也不得不提一下Java,Java 本身有自己的图形库Swing 和 AWT ,所以使用Java 能编写跨三大平台的桌面应用。 * 3、浏览器端应用开发 同桌面端系统各自一家独大,甚至占山为王不同,浏览器由于生在互联网这么一个天生开放分享的环境之上,所以从21世纪初,大家追求的目标,就是标准化。相关的技术,HTML、CSS、JavaScript 都是标准化的技术。只是各个浏览器对版本的兼容,实现,稍有不同而已。在早期阶段,开发跨浏览器的应用还需要经常有一些所谓的Hack,而今,基本上写好页面代码,各个浏览器就通用了,只是在不同的设备类型之间存在适配和兼容。加上有一些更为便捷的开发框架,比如jQuery、支持响应式设计 的Bootstrap,让页面开发变成一件幸福的事儿。浏览器端应用开发,除了流行的这些技术之外,Flash 技术等也有一定的市场,不过随着HTML5 时代的到来,其将逐渐退出历史舞台。HTML5 是HTML的一个升级版,但是常规地认识,HTML5是一个技术的综合称呼,其中包括HTML第5版、CSS3 和 JavaScript的增强。 * 4、后端业务逻辑开发 上面介绍的第1点是服务器端底层技术,这些技术是公用的、底层的,并且即使前端的业务和形态发展,后端和底层并不会有太大的变化。无论是针对手机应用的后端,还是网站后端,数据库、负载均衡等这些技术,都是一样的。并无太大的不同。而除了这些底层技术之外,还需要有实现后端业务逻辑的技术。这些技术直接和底层服务,如数据库和缓存直接通信,并生成响应请求给到前端,供浏览器和App调用。选择做后端业务开发,有大量的语言和技术可供选择,比如Java、PHP、C#、Ruby、Python等都可以,每个都有自己的特点和适应环境,但是作为一个选择,不能仅从语言或者技术本身的适应性和特点出来,还有很多需要参考的因素,比如技术成熟、生态体系等等。 * 5、客户端开发 随着移动互联网的兴起,尤其是社交、游戏、O2O一波又一波,加上国家极力倡导全民创业、万众创新,更是让客户端开发高潮迭起。所以客户端的技术人员也是供不应求。正像桌面开发三大平台一样,客户端开发也有三大移动平台,Linux 系的Android系统,Mac OSX 系统的iOS系统,Windows 系的Windows Phone开发。这属于原生应用开发,各个平台各写一套对于低成本的开发和尝试并不是一个特别好的选择,所以混合式应用开发以及各种跨平台开发技术就应运而生,并且越来越流行。   以上简要介绍了五种开发技术,现在我们分析一下各个方面技术的发展趋势和可能的前景。   操作系统和底层开发,永远都是技术中较为顶尖的一块,这块一方面,对于编程功底需要有比较强的要求,所有开发的成果,也并不是那么直接地能为用户所用。所以需要的是底子比较好,对C、C++等底层语言掌握到位的人。一般转行的程序员,或者非科班出身,想进入这个领域难度比较大,要进入这行,半年甚至一年的学习和训练都是远远不够的。当然,绝不是说不可以,如果你愿意投入,耐得住寂寞,又对计算机逻辑、算法,有比较好的悟性和掌握,这也是可以来做的。但是我们又需要考虑到另外一点,就是这块,作为职业的话,这块的需求和前景永远都在,不过要的人是比较少的,在一个大型的互联网公司里,做核心开发的人员,可能占工程师人数也不会超过10%,对人的水平要求也比较高。当然,薪资水平也是排在前列的,尽管不是最高的。   桌面系统开发尽管是一个需要的领域,但是这是一个市场份额急剧缩小的领域。有的还是原来的一些通用软件,很难有一个新的桌面软件,从无到有然后迅速占领大量市场份额了,即使有,也必须有其他的服务来考虑,比如云端服务,像Slack、有道云笔记。桌面软件有其好处,比如安装在用户桌面上,软件权限更多,起动速度更快。但是软件更新不即时、安装麻烦是其永久的硬伤。对于初学者而言,进入这块的门槛不低,需要学语言本身,需要学习各个平台自己的库,而桌面软件相对来讲逻辑也比较复杂,又加之是一个缩小的市场,所以不建议进入,因为大部分的中小型互联网公司,根本不会有桌面开发的业务,要想做桌面开发,只能去少许大公司的桌面软件部分,比如QQ客户端、微信客户端、安全软件、压缩软件等或者传统软件公司。又因为大部分的操作都已经Web化和移动化了,在浏览器和移动设备端就能实现,比如像ERP、项目管理等,所以这两个领域的人才需求更大一些。   浏览器端开发技术,也就是Web开发技术从21世纪初到现在,一直在不断地演进,从早期的特别简单的HTML,到后面的表格布局,到浏览器兼容问题处理,再到后面的标准化,Ajax的出现,促成了Web前端作为一个职业而产生,到了近期,HTML5 ,智能手机的兴起,更是让前端的领地从PC端延伸到了移动端。前端开发需求量在越来越大,薪资也自然是水涨船高。一个刚毕业能独立 做事的前端,拿个8K是个常态,工作两到三年的熟手,上到15K也是经常发生的。而从另一个层面来讲,前端开发又是一个相对容易入门的行业,HTML、CSS、JavaScript入门学习曲线比较平,所以前端方向适合转行学习和喜欢做能即时看见效果的朋友学习,所以业界有一个现象是做前端的女生比较多,当然JavaScript的学习曲线到了高级部分还是比较陡的,所以又有一个现象是前端高手太少。这个方向的学习需要我们对用户体验有一个较好的把握,同时对于新出现的技术,喜欢去尝试和鼓捣,并大胆尝试和应用到工作之中,比如最近的几年中,响应式设计,AngularJS、Bootstrap 等,作为前端开发人员,都应该去了解和使用,绝对不是一个学完了,就可以用上好几年的技术领域。   后端业务逻辑开发的语言有很多,能做的事情也有很多,以笔者的经历为例,在 2002 年前后,开始做网站开发,使用的是 ASP 脚本语言,使用的是 HTML 和 VBScrpt 配合,读取 Access 数据库,后来读取 SQL Server 数据库。后来又用 ASP.NET(基于 C# )开发网站系统,再后来进入工作岗位,使用 JSP、J2EE、Swing 开发富交互的 WebGIS 系统前后端,后来又用 PHP 开发全文检索的业务逻辑端,底层用 Java 开发 Lucene 应用,再后面是用 Perl 等开发文本和视频处理脚本,用 C 开发底层爬虫逻辑,再后来基本就是 PHP,开发网站大型应用逻辑。对比前端 HTML5 技术,后端的技术和框架技术,更为庞杂,但是在演进上也相对慢一些。理论上讲,学习哪一种技术,都有工作的机会,但是我们也不能随意选择。比如同样是 JSP 和 JavaEE 应用开发,如果选择做 ERP 等软件系统,相对就是一个过时的选择,而去网站后端相对就更好一些,如果是应用的后端 API 也很不错,这是时下流行的。那也许有同学就要说了,不都是同样的技术么?做哪个不一样吗?理论上说是这样,但是做 ERP 和做互联网产品,面对的流量量级是不在一个层次上的,所以对于很多问题的经验处理也不是在同一个层次上的,做软件,重视的是各种复杂的逻辑和工作流的处理,做互联网更看重的是简洁的逻辑和高并发的架构。不同的路径,导致了不同的能力层次,也会导向不同的工作机会,做互联网产品的薪资水平和机会,相比做软件的机会要好得多,并且多得多,当然压力也大得多,不过年轻人就应该直面压力,不是么?学习这个领域,需要的不仅仅是学会了语言,更需要的是业务能力,比如做游戏后端的整体设计能力,以及怎么写出更高质量、更具有可维护性和扩展性的代码。更重要的是,对于架构和大用户量、大数据的追求和把握,可能是到了一定年限的工程师所需要去追求的。这个方向短时间内不会太过时,但是有很多的核心服务,比如数据库服务、存储服务等,会慢慢地被云服务所取代。这个领域,由于成果不太能看得见,摸得着,所以相比前端,女生学习的比例非常少。   移动客户端开发是近年随着智能手机兴起的开发技术。勿庸置疑,这是正在兴起的朝阳行业,由于移动互联网比传统互联网能更紧密地把人联结在一起,所以移动互联网产生了比传统互联网更大的机会。那么,是不是,学习移动客户端开发一定就一劳永逸呢?首先在技术研发领域,没有一劳永逸的事情。其次,客户端开发,同Web前端开发的机理是类似的,在有的公司也叫前端开发。做前端开发一个最大的缺陷是,能掌控的是界面和体验,但是绝对不是整个应用的核心技术。再次,在平台的选择中,也要考虑到,Android(主要基于Java语言)和iOS(主要基于Objective-C语言,将被Swift语言替代)是目前最大的两个平台。如果选择专职做Windows Phone 或者其他没落的平台,可能工作机会就相对少得多。第四,由于在客户端研发中,每个不同的平台,一般需要从头到尾从新研发,所以跨平台的研发技术,对于纯原生的Android、iOS应用开发造成了挑战。总之,随着设备的更新升级,跨平台开发技术,也许会更加流行。因此,在关注原生技术的同时,也不能固步自封。学习这个方向是很有前途的,但是不能仅仅关注应用在界面端的绘制和简单的交互逻辑的实现,更要关注代码的架构和可维护性,以及在有条件的情况下,能更了解后端,以写出更好的代码,同时学习相关联的技术。   以上就是对于各种技术及其趋势的一个简单分析。在选择这些技术的时候,我们应该选择面向未来的技术,而不是没落的技术,应该选择职业面广技术,而不是就业机会少的技术。应该选择承载用户量大的技术,而不是用户量少的技术。我们选择技术学习,也不要偏执地认为,某一种技术,就一定比另一种技术好。大多数情况下,特别是职业发展到一定程度,往往是学会了多种技术的,而技术之间,往往也是融会贯通,学了一种之后,学习另外一种,不是那么地困难。比如苹果 Swift 语言出来之后,对于有好几年的编程熟手而言,学习一门 Swift 也就是几天的事情。学习 iOS 的 UI 开发,使用 UIKit ,跟使用 Java 的 Swing 和 Windows Form 控件并无太大的不同。这也是全栈工程师之所以能产生的原因。当然,在我们的眼里认为,全栈并不意味着全能。后面就会分析到。   技术方向这么多,编程语言这么多,在我们学习,尤其是初学者学习的时候,不要贪多,专注学习解决当前问题或者达成当前目标所需要去学习的技术,比如,想学会开发网站,就不需要去关心客户端怎么做,重点学习好 HTML、CSS、JavaScript,再加一些框架和后端语言,比如PHP,最后也一点,也是最重要的一点,职业发展的高度,往往不是说你会某一门技术而决定的,而是由对于逻辑、计算机算法、原理本身的理解,以及对业务的把控等能力而体现的,因此,除了学习流行技术之外,我们也要关注自己的更编码能力、算法功底的增强。 ####个人情况 除了技术趋势之外,选择学什么跟个人条件紧密相关。这里笔者就从个人体会和面试经验出发分析一下。 主要分为以下几个方面: #####1、学历背景   编程本身并不需要学历背景,从5-6岁开始就可以接受编程思维,比如 Uber 创始人卡拉尼克6岁左右开始学习编程,10岁左右就可以开始使用编程语言编写软件,比如微软创始人比尔盖茨、Facebook创始人扎克伯格、Telsa CEO 马斯克都是在10岁左右开始学习编程。有初中以上文化,对编程思维和逻辑的基本理解也不会存在问题。但是对于某些知识有要求。罗飞老师并没有上过大学,但是其对计算机编程的理解和掌握比一般的科班人好不少。但是对有些能力还是有要求的,比如英语,如果对英语很发悚,单词不识几个,也没有决心想学好,那编程工作也有可能不适合你。总结起来,我们至少得考虑三个方面的事情。 * 英语水平 首先是英语水平,在学编程中,虽然不是说英语要达到多少多少级,但是英文水平对于学编程有非常重要的作用,尤其是发展到一定阶段,寻求上升时,特别是在解决一些编程问题时,在中文网站上,往往很难找到合适的资料。所以需要从国外的网站,比如 Stack Overflow 上去了解。如果学历上的限制,导致了英语水平不行,也是要注意加以改进的。 * 从业圈子 由于学历的不同,可能接触到不同的圈子,或者由于某些原因,比如不太自信,从而不一定能接触到高一级别的圈子。当然,所谓圈子的事其实是看你本身的能力的。只要你有能力,你就能进入圈子,如果没有能力,即使进入了圈子,也不一定能发挥作用。 * 工作机会 仅管学历并不代表能力,但是高学历,好学历的人在大多数情况下是相对比较优秀的。因而在公司招人的时候,为了降低自己选拔人才的成本,会把学历当做一个检测标准,过不了的话,就基本上不会有机会。   如果学历比较低,非得学习一些对算法等要求比较高、比较底层的技术,而这些技术,又相对是在大公司才需要比较多人才,而小公司不怎么需要的技术,那这样就是走了一条成功机会不大的弯路。反之,我们应该去学一些技术门槛比较低的,比如网络维护管理、运维、前端页面开发、后端页面逻辑开发等工作,可能更加适合。 #####2.专业背景   计算机编程,相对也是一个专业技术工作,虽然上面说了,高中毕业水平,并不影响编程学习和水平的发挥,甚至技术和职业成长也不影响。但是如果从大学生过来,想迅速学习技术和求职,还是要考虑一下专业背景。   编程行业,是一个工科工种,如果想快速地进入编程行业,最好有一定的专业背景,计算机专业最好,工科和数学等理科专业次之,其他文科专业相对就会比较费劲,当然这也不绝对,在我们优才团队还有文科专业背景不错的研发同事,看似例外,实则没有例外,他在上大学时,就不喜欢自己的专业,对计算机的鼓捣比一般科班的人还多。   计算机科学与技术、计算机应用、软件工程等专业的同学算是计算机科班出身的同学,这些同学在大学(这里指的是一般的国内大学)里会学习 C/C++ 或者 Java 等编程语言。所以针对前面所说的方向,有针对性地学习一门流行技术,并不是难事。建议基于自己的已知技能和兴趣出发,专注地搞定一种技能,比如有 Java 经验的,可以开发 Android 应用,有 C/C++ 经验地,可以学习 iOS 开发,或者学自己感兴趣的,Swift、JavaScript、PHP等都是不错的。学习来相对比非专业背景的同学有优势 。   其他的电子工程、自动化、通信、信息管理与信息系统、电子商务等专业方向,则属于计算机相关专业,这些同学所学习的内容,让其对计算机编程的原理有过一定程度的了解,也有过编程语言的经验。在选择方向时,建议从职业目标出发。而不仅仅是从已知出发,笔者面试过不下数百人,大学生由于在学校缺乏相应的技能准备,于是乎在找工作时,想当然地从自己的已知出发,要找 C/C++,嵌入式开发等方面的工作,殊不知这些工作市面上的职位需求少之又少,要求又高,关键是薪水待遇还很一般,同此相似,在国内有些同学学 Python、Ruby,也是如此,不从市场需求出发,纯粹从某些建议或者自己的喜好出发,导致找工作时机会少、薪资低。   其他理工科专业。其实理工科转计算机专业都不存在特别困难的专业门槛,反而在笔者的职业过程中,有不少大牛,并不是计算机专业的,甚至也不是计算机相关专业的,而是出自物理、地理等院系,笔者也分析了一下原因,就是由于计算机专业的人,往往仗着自己的专业,而并不是特别地下功夫学习,而这些理工专业转学计算机的,相当地卖力,大学又有好的环境和比较硬的理学类学科底子,从而很多底子都学得很扎实。   文科专业的大学生,转计算机程序开发的并不是特别多,不过有一过方向,我见过不少做得不错的,文科生不少,那就是前端。前端由于入门门槛比较底,除非是 JavaScript 专业开发,否则对人的逻辑要求并不是那么地高,所以设计、数字媒体等有一定设计背景的同学转前端,就自然而然了。更有甚者,我见过一个前端不错的朋友,是来自于国贸专业。至于其他方向,除非有特别的兴趣,并不建议文科同学去尝试和挑战。 #####3.性格兴趣   由于编程行业,是一个脑力工作,要求对逻辑、理性、好静的要求多一些,对发散、感性、好动的要求少一些,如果你是属于后者的重度表现者,耐不住寂寞的话,那么编程即使要学也可能只适合你作为兴趣,而不是一个职业。   编程方向不同,需要人的基本素质也有不同。底层和核心的研发,需要的是比较严谨、缜密的逻辑,在没有用户界面的情况下,清晰地分析和对各种情况进行测试。需要人能细心地坚持,可能比较长一段时间,都在编写一个模块,增加一个功能,调试一个BUG。需要有很强的分析问题和解决问题的能力,在编写的东西上线或者发布了之后,能够在最大程度减小损失和影响的情况下分析问题,修复问题。   对于前端的研发,如果涉及到从图形到页面的代码的转换,除了从技能上要学会一定程度的PS操作之外,也需要有一定的美感,并有一定程度的细心、细致。比如对于一个没有美感和粗心的人,切出来的图,如果本领不过硬的话,可能会或多或少有偏差或者失真。而对于有美感和细心的人,可能能发现设计和交互上的缺陷,对于一个像素的不足也会想办法去改进。   而对于后端业务开发,需要的能力可能比较综合。而不仅仅是编程技术,比如包括前后端协调、综合,包括业务能力的分析,相比底层开发,后端业务逻辑开发,需要与人打交道的地方,比如开会、分配业务、收集反馈等,要多得多。所以如果是特别不愿意和人打交道,技术水平和底子又不错的,而且对开发用户逻辑产品没有什么兴趣的话,可以学习底层方向。如果愿意开发用户能直接使用的产品,则去学习后端业务开发方向。   对于移动端开发,同前端开发一样,需要注重的是交互和用户体验,所以在这块有一定基础或者愿意培养的同学,可能适合做移动端开发。因为对于做移动应用和其他客户端产品而言,有比较大量的工作是在做界面和界面上的交互,即使交互之下,也需要考虑用户体验,所以最好除了技术实现之外,在用户体验方面有自己的看法和考虑。 #####4.家庭环境   虽然没有说某类家庭环境出身的人只能做某类事情,但是个人的择业跟家庭成长还是分不开的。比如你本来大学就是助学贷款上的,还继续去连读硕士、博士就相对就会比较困难,那么计算机编程这个行业相对来讲就适合你,这个行业对学历的重视比某些行业,比如金融、公务员行业弱得多。   如果你是富二代,甚至家里还有产业要继承,那么相对加班加点,辛苦劳作的编程行业并不见得你能真正投入,如果不能全心投入,也不会有太大的成就,除非以此为锻炼和跳板,进一步转入创业。   我相信,绝大多数以编程作为职业的兄弟姐妹们都是普通人家的孩子,以藉此在这个时代取得一份稳定发展,薪资不错的工作,赚的可是一份辛苦钱。   家庭经济条件其实也是要考虑的,由于大学里不教这些技术,所以一般需要通过自学或者是通过培训学校的学习。而培训学校的学习,无论哪个方向都会是一笔不小的费用。最便宜的市面上是前端培训,也要大几千块,最贵的(除去 SAP 之类的)培训,比如 iOS 方向,一般在 16000 块以上。而学习 iOS ,除了学费本身之外,还需要有设备,像苹果电脑 、iPhone、iPad 这样的设备,当然了,培训学校本身会提供贷款、设备也由学校出,到了工作单位一般单位也会配电脑。不过一般情况下,除了公司设备之外,程序员在业务还需要能鼓捣和学习,这个时候就需要一笔投入。不过总的来讲,这种投入和产出比是非常花算的。即使高达 16000 块的学费,也就是毕业以后两个月的工资而已。   如果是完全自学,这些投入可能需要自己去投入。所以在经济条件上是需要去考虑一下的,如果实在想学 iOS 开发,自学的话,一种是安装黑苹果,借用别人的设备和账号,其次是曲线救国,比如先去自学像前端、PHP等除了电脑之外,基本不需要额外成本的技术,在通过实习等工作机会赚到的一定的钱,再去学习 iOS 开发。   编程工作,对身体也有一定的要求,我亲手带过的资质不错的小兄弟,由于有一定眼疾,离开了这个行业,盯住电脑到了一定的长度,就非常不舒服,所以真的是身体不合适,也就不要勉强。   最后就是你的兴趣和爱好,如果对编程的没有兴趣,完全是强迫为之,如果是那种下了班,关了电脑就不想开机的同学,我是不建议你学习这行的,这行的成就需要你的努力和付出,绝不仅是上班那几个小时,甚至更重要的提升来自于上班后的付出,要做互联网的话,7X24能联机是一个基本的工作职责上的需求。   聊了这么多,知道想学什么了吗?如果你符合上面的推荐对象,那恭喜你!如果不是也不要太过在意,凡是总有例外,编程这个行业,拼的是个人能力和努力,无论你是什么情况,在这里,都可以找到你的存在和成就感,那怕是纯兴趣,只要你选择它,它都不会嫌弃你!