那么,开始吧...
你现在快要结束第一学年(相信我,一年或两年后也不会有太大变化)。但此时你几乎没有任何知识。即使你毕业后,第一年也只能期待250到300美元的工资。你甚至很难被称为初级程序员,因为你几乎没有理论知识,也没有实践经验。
你对理论的了解很差,原因有四个:
- 这是一个非常广泛的领域,在课程范围内不可能学到所有内容。
- 大多数情况下,学习的是过时的材料。
- 在课堂上,你很可能在社交媒体上闲逛,与同学聊天,或者只是去上课打个卡。你只理解30-40%的内容,即使主题简单,你记住了80%,但如果课后没有实践来巩固,效果也不会好。例如,在我的实践课上,我常常在网络上玩CS(同时勉强完成实验,只是为了通过)。
- 要学习和吸收知识,需要理想的心情、兴趣和环境。早上8-10点,几乎不可能有任何学生具备这种条件,结果是材料难以消化。在大学上课和在家沙发上晚上看同样的YouTube视频是截然不同的体验。
因此,作为总结,毕业后你会超过20-22岁。你什么都不知道,也不会做。最好的情况是,在最后一年找到一份兼职工作,至少能获得一些经验。
你把所有的空闲时间都花在散步、追剧和安排个人生活上?如果你已经走进IT领域,这种工作模式肯定不适合你。
我已经不再上大学,完成了IT专业的学院和大学课程,对这一切有了完全不同的理解和看法。首先,我想告诉你的是,那里并不会教会你什么,上面我列出了四个重要的原因。其次,如果你真的喜欢这个领域,你需要培养自己自我学习和不断进步的习惯。每天都要自我学习。我很少能找到一天不看或不学习新东西(有时我在工作中也会在后台学习),但大多数时候是在我的空闲时间。
我每天也会去散步,我也有个人生活,进行跑步和足球等运动,还有其他的兴趣、爱好和旅行。只需要合理规划自己的时间。有时可以制定周计划,但要留有余地,以便随时调整。最重要的是,养成每天学习的习惯……几乎每天都要学习。
程序员通常是懒惰的人……最好的学习方式是通过书籍,但因为我也懒惰,所以我听播客和看YouTube(而现在我已经达到了相当好的编程理解水平,很难在YouTube上找到有价值的新内容,但我仍然会找到并观看,偶尔也会读书)。因此,养成每天进行自我学习的习惯。你可以选择一些符合你兴趣的编程播客,收听新剧集——这样你就能了解IT世界的最新动态和技术。
不要期待在毕业后会有什么变化……你会变得更聪明,某家公司会立刻打电话给你,提供至少400美元的工作。想象一下,昨天你刚拿到毕业证书,现在你需要继续前进。
现在在大一(或大二,没关系)时,了解你在这个领域想做什么非常重要。如果你在IT中选择了编程,而不是SEO或设计等其他方向,那么这里有几个方向:
- 系统编程(编写操作系统、驱动程序等)——这是低级编程,我认为有点无聊,但也很复杂。
- 游戏开发——对此我就不多说了……最好了解一些物理知识。
- 网页开发——其实并不难,相当有趣,但我可以说的是,需要了解非常多的知识(不过在其他领域,可能也是如此)。
- 移动开发——我也不能说这很难(这里主要分为两个领域:Android或iOS,尽管还有其他一些小领域)。顺便说一下,网页开发也有两个方向:后端和前端。
- 应用程序开发——为笔记本和PC编写程序——也是普通的复杂性和趣味性。通常大学里就是从这个开始的。
- 科学计算——这是一个非常专业的领域,针对特定的学科和科学:无论是生物学、化学、数学等。
在我看来,最受欢迎的领域是网页开发、移动开发和应用程序开发。你随时可以更换方向。但如果你在应用程序开发方面是高级程序员,这并不意味着你转到移动开发后也会是高级程序员。你的水平会在一两年内(最好的情况是一年)降至中级,因为这完全是不同的领域,有着自己的规则和方法。
程序员的知识水平也有自己的分类:
- 初级(Junior)——完全不懂,错误频出。所有任务完成后都需要检查,可能需要修正。没有工作经验或经验极少。
- 中级(Middle)——相当不错的程序员,能够解决中等甚至较难的任务(算法)。有1-2年的经验。已经掌握了一些知识,可以信任。
- 高级(Senior)——非常优秀的专家,几乎知道所有内容。工作经验至少4-5年。有时,达到这个水平可能需要更多的时间(这取决于个人素质和可能的领域)。
再次强调,关于经验和这些分类——都是相对的。在我们明斯克的公司里,可能一个高级程序员在谷歌只算是初级程序员。
还可以提到团队负责人(我们可以称他为小组长 :))。他负责在团队中分配任务,检查所有工作,并执行一些困难的任务。团队任务的全部责任都在他身上。通常他们是高级程序员,但也可能是非常优秀的中级程序员。
还有软件架构师——他们是超级聪明的人,通常是高级程序员,甚至可能更高(我自己并没有达到这种"禅"的状态,因此无法准确描述 :))。这完全取决于水平。例如,要在网页开发中合理设计架构,仅仅是后端高级程序员是不够的;还需要对前端有很好的了解——这就算是全栈开发者了。
不要太在意那些会强加自己技术和编程语言的人,他们会说哪个更好……这一切都完全取决于具体情况和任务。市场上有5到10种主流语言,已经快20到25年没有改变过,依然保持着竞争力(有时候它们只是相互之间的排名会有所变动,特别是当某些新特性、更新或框架出现时,但这些语言仍在不断发展)。我特别提到以下语言:C、C++、C#、Python、Java、JavaScript和PHP。至于较新的语言,有Go,可能还有Rust。还有专门为移动开发设计的语言,比如Kotlin或Swift——这两种语言确实相对较新(大约只有4到5年的活跃使用时间)——这是有逻辑依据的,因为移动开发相比于网页和应用开发是最新的领域,因此一些专门的语言也形成得较晚。
总的来说,需要理解编程语言可以是功能性的,也可以是面向对象的(还有其他编程范式),并且需要知道它们之间的区别……此外,还要记住它们的工作方式:有时使用编译器,有时使用解释器(但这已经是细节了)。当程序员能够理解异步操作、进程和线程的层面时,真得很令人印象深刻,但这需要时间。
此外,不要听那些说PHP是垃圾语言的人——那是缺乏编程知识的人的观点(这个笑话源于糟糕的编码者和PHP的低门槛,这其实是它的优势;也因为它早期确实很糟糕……但那是在2000年,最多到2007-2010年。现在的PHP非常好,全球超过70%的网页项目(后端)都使用PHP)。同样可以说JavaScript(甚至有个关于妓女和JS的笑话)。我也不喜欢它,但经常使用它。我还听说过关于Java和Python的批评……虽然我觉得任何语言都可以找到笑话。所以这纯粹是个人品味问题。
所以,既然你已经决定了方向,我会尝试用网络技术的例子来解释为什么尽早开始学习编程如此重要,以及为什么不能依赖教育机构。要成为一名优秀专家,你需要深入掌握几种编程语言。除了语言,你还需要了解很多技术、协议和一些对程序员有用的基础内容。我甚至不提你要了解算法,以及强烈建议熟悉的数学(从高等数学和概率论到离散数学和数学建模)。但说真的,如果问现代程序员是否需要数学(除非是特定工作),我的回答是"不"。在80%的情况下,工作就是从数据库获取数据并显示(简单地说就是显示在屏幕上)。无论是移动、桌面还是网页应用,都是如此。或者将数据写入数据库。更重要的是,要按一定的架构正确完成。我会列一个清单,即使对于优秀的全栈开发人员(以及前端或后端开发人员)也适用……这真的是一个庞大的清单。但这是必须要知道的。好吧,开始:
前端:
- HTML5(还要关注第六版的计划)。
- CSS(如果可能最好看一下草稿),并正确使用选择器(记住,CSS的工作原理是从右到左,还有其他细节)。
- 至少了解一个CSS框架并理解其工作原理(Bootstrap非常适合)。
- 了解CSS预处理程序(Sass、Less等)——知道它们是如何工作的,并知道如何使用。
- 你应该了解基本的SEO知识——这很关键(知道如何使用HTML5标签,不能将区块元素放入内联元素,使用h1-h6标签的位置和数量等)。
- JavaScript(从ECMAScript 6开始)——你可以花很长时间只研究这门语言的纯形式……还有其他很多方面需要注意:
- jQuery(非常棒的库……但框架更好)。
- 框架(React、Vue、Angular)。
- npm——包管理器。
- 构建工具(Gulp、Grunt、Webpack)——它们还需要进行SEO,以便只传递页面所需样式和脚本,不传递多余内容。
- 掌握Emmet。
- 如果不习惯写普通脚本,就去学习CoffeeScript或TypeScript。然后记得学习Babel或其他JS编译器。
- 搜索引擎的API和排名算法(这更偏向SEO)。(+ AMP、Turbo、Yandex Zen)。
- 布局(有效、跨浏览器兼容性、现代、响应式)。
后端(以PHP为例):
- 纯PHP。
- 内容管理系统(我使用过很多,但我建议使用WordPress)。
- 框架(Laravel、Symfony、Yii或任何其他框架)。前两个最受欢迎。
- PSR,规范如何编写代码——在哪里加引号,在哪里加空格(制表符),如何命名变量,以及很多其他方面的规范。
- REST —— 这也是编程规范和命名方法的方式,和第四点一样。
- 安全性 —— 我不确定安全性在移动应用开发中是否受到重视,但在网络开发中往往是大问题。这是合理的,因为网络开发最好的调试工具就是浏览器。通过它,你可以获得很多关于网页的信息,如果你安装某些扩展,还可以进行一些较为复杂的操作。这会导致在网络开发中,黑客也能进行很多操作,因此必须知道如何防御SQL注入、XSS漏洞、以及跨站请求伪造(CSRF)——尽管这并不是唯一的威胁(也可能包含DoS和DDoS攻击,但这主要是服务器配置问题)。
- ORM系统(Doctrine是合适的)和PDO 。
- 控制台(我几乎每天都在使用)。
- 服务器设置 —— 至少要知道基本知识,知道服务器如何运行,以及处理请求时后端会发生什么。
- Docker —— 最好了解云存储,以及现成的项目容器。最好知道Kubernetes、OpenShift等。也许,依赖云比自己在本地搭建一个大型技术栈更好 。
- 作曲家。
- 库尔。
- 协议 —— 这一点应该放在第四点到第六点之间,但我不打算重写了,需要了解HTTP, HTTPS, FTP, SSH等协议之间的区别及其工作原理 。
- 最好会用IDE,例如PhpStorm,或带有安装的扩展程序的好文本编辑器 —— 这也适用于前端 。
- Linux —— 大多数服务器运行的是这种操作系统,因此了解它是非常有必要的 。
此外,你还需要要了解面向对象编程(OOP )。有些功能性语言,可以在不写一个类的情况下完成一个启动项目。但是PHP(像大多数现代语言一样)是面向对象的,因此要了解OOP 。了解得越深入越好(类、接口、继承)。了解不同的编程范式也不错。你要明白,同样的代码,在同一种语言中可以以不同的范式,用不同的方式写出来。你的项目必须遵循某种范式。这也适用于变量命名,要么选择camelCase,要么选择snake_case,并且保持一致。
你应该知道设计模式 —— 我承认,当我还在大学学习这些时,我觉得这是最没有用的话题 。并且我要承认,这个主题对我来说是最复杂的。任何设计模式都可以有不同的理解(仅在网络开发这个领域,就会发现某个设计模式的多种不同实现。而如果是在应用程序或者移动开发项目,实现方法又会有所不同 )。总之,这是一个模糊的话题。但它非常重要。
SOLID —— 这就是如何写代码的原则。但SOLID并不是唯一的原则。顺便说一下,REST和PSR(我之前提到的)也可以归类为正确书写代码的原则。
必须进行测试,包括PHP中的单元测试 —— 这当然是理想情况。我几乎不写测试……尽管它们是必要的 。你要明白,测试也有不同类型:功能测试、验收测试、单元测试等。
你要会用Git、Mercurial,或者其他任何版本控制系统 。
别忘了处理数据形式:JSON、XML、YAML 。
一定要养成一个习惯 —— 随时跟进你使用的编程语言和技术的更新。编程语言更新的并不频繁,但有时可能有根本性的变化 。
当我在教育机构学习时,我以为处理大数据和优化代码的问题不会影响到我,或者这个问题非常遥远。事实上并非如此。我已经很久在处理少则几万条数据的项目了,虽然在拥有数据库基础知识和表的规划性的前后端问题很少出现,但在前端问题频现。搜索引擎要求非常高的代码优化和性能(尤其性能)。在这里,你要明白如何加载所有内容异步或者延迟。你也许已经有了完善的语意核心,但如果加载速度不被优化,那分毫意义都没有 ——这就要求你必须关注这个问题。
编写正确的代码将确保你长期使用项目(或者几个月),并且即使删除(或者禁用)了某模块,在项目中也丝毫没有任何多余代码存在。这或许发生在前端CSS和JS代码未规范排列。那是“死亡代码”。毫无用处,但搜索引擎会找到并抱怨。
同时,我几乎没有涉及数据库……这就意味着你已经知道该如何操作它们。但无论什么具体数据库都无关紧要。
你需要学会架构方法和应用架构…………每个部分都不同:网页、移动应用和桌面应用。举个简单例子,我们拿大型网页项目来说:后端由三个部分组成。一部分是用Symfony编写的,第二部分用Laravel,第三部分用纯PHP。前端有两部分,使用React和Vue编写。如果进一步扩展,它自带有架构及模式 ——无论是大的还是小的。你需要分段写代码(比如说将模型封装在repository,不再直接访问模型,而是操作repository,使用observer等)——让你的代码美丽,让应用模块化并且可扩展性强的。但要牢记,分段越短,应用跑得越快(比如,在某些地方用高运行速度的PDO代替ORM连接数据库)。这些理解将随着时间的流逝而累积。
再来说一个非常重要的事情:你需要在大型项目中使用框架。框架通常比单纯用代码编写要复杂得多。但是框架带来许多好处:
- 它可以加速应用的整体开发速度。
- 经常框架会规定一定的书写代码风格和哲学。通过你会设计出更少的垃圾代码。
- 有大量现成模块可用(如认证模块),你不需要去思考它的底层实现逻辑(简白认证,基于Token,JWT等等)。
- 安全问题。正如我所提到的,在网页开发上它是个非常伤脑筋的问题。框架已经帮你妥善处理了。
有一个关于全栈开发者的说法,认为他们只有中级水平。对此我部分同意,我大部分暇余时间都在学习,自我提升来避免这种说法,使我能够在前后端都有高水准的项目输出——不止单一,而且还能使用新颖的科技。
我没来得及谈到英语,但……懂得越多越好!
不必开始就两面齐学,你可以先专注一方。只需记住:如果你去年写的代码很烂,而要你今天重写你会做得更好——你已经走上正轨了。
以上我说的就是网页开发……或许还漏了什么……但相信我,绝对涵盖了90%优秀专家所需知识。另一个问题是,如果要掌握这些,可能需要很多年的时间。如你所见,我主要用了两个编程语言,但除此之外,如我之前的提到还有很多其他必不可少的东西。在其他领域,我觉得不会有太大改变……它们各自有其技术和语言……但基本原理和范围基本是一样的。
不是所有我学的东西(特别是那些全新或者复杂的事物)我一次就能搞清……肯定要多翻翻、多瞧瞧才会完全理解。所以,如果在第一次有些东西不了解的话,你也别太在意。同时也取决于材料的说明者(有些写手和表达者会解说得比较好,有些却不然)。
现在你知道你将面临什么,也有两个抉择:要么现在就拿起这份文档,要么从今日起开始编程学习。
这儿有许多专业术语,即便是二、三年级的学生也难以解了,不过互联网上有海量信息资源供你参考。现在你明白从哪里开始和要学什么了。这个列表相当于马赛克镶嵌画,每一项就是一小块拼图,当你掌握列表中的部分内容后,你脑子里关于网络编程的宏观图将会更明了而准确。或许这盘错咬的列表会指点你进入正道,但这是自然存在的,因为在我最初学习的时候,我必须自己在网游和书海中收集最细小的拼图,通过试错法,细筛冗杂和反复的内容。
程序员职业利弊总结。
优点:
- 前途璀璨的职业。优秀的专家绝不会失业。
- 薪水颇丰,虽然并非一朝一夕可得。
- 在IT行业工作时,时刻跟进行业内最顶尖的风向。
- 比许多行业弹性工作制的工作时间。能够在方便的时候工作,甚至可以远程为其它国家服务。
缺点:
- 需要知晓海量知识。频繁自我提升,并使用先驱技术方法。
- 十分希望你能懂英语。
- 影响健康。据说视力会因此变糟。程序员乃久坐工作队,需体育运动活跃。
- 责任重大(例如:处理银行和财务数据)。
- 时而难以和客户、经理融洽交流。