全世界只有3.14 % 的人关注了
数据与算法之美
在很多人看来,也许优秀的程序员靠的就是与生俱来的强大天赋,外加蜻蜓点水般的时间付出,就能够炼就算无遗漏的编码技能。那么果真是如此吗?身为不太聪明的开发者难道就活该中途止步吗?本文的作者就表示“不想承认自己太笨,学不会编程”,然后凭着这样不服输的精神以及对开发工作的热爱,他加倍地努力,脚踏实地地一步步走出了自己的开发者之路。
在本文中,他分享了从最初的程序员小白、到现在的高级工程师,十四年的时间他是如何不断提升自己的,希望借此文,能够给广大的程序员们以勉励:输在了起点,并不意味着就输掉了终点。
以下为译文:
在我看来,编程从来都不是易事。我第一次编程是在11岁,那时候我拿到了如下这本书。而且当时我很喜欢玩任天堂64,还梦想着以后自己制作游戏。
《青少年游戏编程》,这本书改变了我的一切
但是,想象是美好的,现实的我能力却远远低于平均水平。
我曾在这些论坛(http://mojolabs.nz/forums.php)写了一篇文章寻求帮助如何理解一个while循环——毋庸置疑,我表现得像个浑身长满刺的小刺头,因为我觉得那些比我聪明的人老是用高人一等的语气跟我说话,告诉我应该好好学习一下基本知识,而不是一头扎进电脑游戏的制作。
当时的那些论坛大概像这样(大约在2005年)
所以,虽然我的野心很大,但是这个TwisterMan(转圈圈的小人)不会自己编程!(我完全是用微软的画图软件手动画出来的......)
TwisterMan动画框架,这个小人正在施展旋风腿
小心下面这个长刺的家伙!
嗷……
还有下面这个大Boss……
咩……?
重点在于我发现我不擅长编程(而且在设计方面也没有天赋,呵呵!),我不明白如何才能像程序员那样思考,而且我的学习之路也很崎岖,因为我没有任何基础知识。直到十四年的现在,我的编程技术才有所进步。
为什么这么呢?难道这意味着你必须经过14年的努力才能成为一名优秀的程序员?还是说每个人的编程职业生涯都要从画长刺的小人开始呢?在这篇文章中,我就来分享下帮助我提高编程能力的具体事宜,以及每个人在成长过程中所需要经历的不同阶段。
入门阶段
不要以为自己能轻易做得很好
做人要谦虚,阻碍你成为优秀的程序员的最大敌人就是你自己。此外,谦虚可以使人快乐,所以何妨一试呢?不过,即使嘴上说着你会试试看,但是固执己见的你根本就不会听我的话,对不对?骄傲最难克服了。
认真学习基础知识
在你开始学习基础知识时,不用担心基础知识之外的东西,也不必将你的程序用图形表示出来。
新手入门时你可以做的最大努力就是学会理解、遵循逻辑:理解如果if语句中的某些东西为true,那么if语句内部的语句会被运行;理解for循环的执行次数;理解大括号的用途;理解不同的原始数据类型......等等。
不必担心算法问题
我十分不喜欢纯算法的问题。我认为这些问题并不能决定你是否是一名有经验的程序员,这家猎头公司也有相同的看法(https://triplebyte.com/)。
说实话,我就不太擅长一些数学编程算法,而且我也不擅长解逻辑谜题!要么你喜欢算法,要么你对它们漠不关心——所以不必担心你属于哪一种,重要的是你要有解决问题的能力。
变得勇敢
这一点很重要。姑且先不说程序员,如果在生活中如果遇到挫折你没有勇气再站起来,那么你就会很痛苦。如果在编程的时候你不够勇敢,那么你会更痛苦。我认为我成功的最大因素就在于勇敢。
勇敢的真实模样
但是,要成为勇敢的人并不容易。金钱买不来勇敢,你必须培养、锻炼、加强你的勇气。最重要的是你需要一个培养勇气的目标,如果没有目标,那么你会丧失前进的理由。
那么我的目标是什么?我如何成为了一个勇敢的人?很讽刺的是,我的勇气来自我的骄傲。我很固执,一门心思想学编程,因为编程很难;而且我无法忍受这个事实——编程太难,我学不会。
所以我加倍地努力,因为我不想承认自己太笨,学不会编程。从入门到实践,推荐阅读《Python编程》
建立一个小项目
这个项目并一定要很大,你只需建立你感兴趣的东西(或者在某些方面有用的东西),然后扩展并尝试一些你没做过的事情。
我做的第一个应用程序是一个控制台应用程序,它可以接受一些输入,例如作者的名字和姓氏,以及他们发布的作品,然后按照美国现代语言协会的风格来格式化展示这些作品的页面。
整个应用程序大约有70行,包含获取用户输入的代码(类似于C#中的ReadLine),然后以正确的格式输出,就是如此简单的一个控制台应用。
新手阶段
在这个阶段,你可以编写一些代码了,但还无法编写任何实质性的东西。你明白不同的类型,还知道一些不同的术语,但大部分编程方面的经验可能仅限于在一个编辑器中使用一种语言。你也可以编写简单的练习,但前提是有人给你解释清楚。
阅读别人的代码
我作为新手的大部分时间都是在大学里,我从StackOverflow上学到了很多东西。多看,多读,注意别人写代码的方式。StackOverflow可以帮助你拿下学位,这可不是一句笑谈,请看下图。
随着经验的增长,你会越来越依赖StackOverflow
向那些没有听说过StackOverflow的人解释一下,StackOverflow是一个编程答疑社区。人们在上面发布有关编程的问题,社区负责解答。你可以给优秀的答案点赞,而质量较差的答案却无法得到点赞。
在StackOverflow上你可以同时看到好的和坏的代码(偶尔也会看到有趣的代码),但是请不要过于依赖死记硬背如何编写完美的代码,你需要在经常访问该网站的时候注意那些编程的模式。
学习面向对象
我估计大多数开发人员都会接触到面向对象的系统,因此学习面向对象至关重要。简而言之,面向对象可以按照对象的关系和逻辑组织你的程序,通常对象可以反映你正在使用的域。
想了解更多关于面向对象的内容,可以参看这个链接:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/object-oriented-programming。
参加高难度的课程
这一条仅适用于学生,但如果你不在学校,那么也可以在网上学习算法(https://www.coursera.org/specializations/algorithms)。
算法是必须学习的内容,你需要学习数据结构和算法,包括堆、堆栈、队列/链表、指针等等。只要你顺利通过这些高难度的课程(而不是蒙混过关),那么你的编程技术就可以得到进一步的发展了。我建议你至少拿到B或B+(或者你的在线课程的同等评分)。
但是很有可能有至少一半的人无法通过这个课程,或掌握这些概念。这门课程真的可以淘汰那些无法进一步发展的人(这就是为什么勇气如此重要!!),祝你好运!
再次扩展项目
这时,你可以接受另一个比你以往从事过的项目更大的项目。合适的项目包括Web应用程序、硬件项目、为开源库做贡献(如果你愿意接受挑战的话),或者也可以是桌面应用程序。
这些你可以参与的项目很有可能就是你的实习项目(或者可以让你获取相关的经验来申请实习的职位),所以如果你对你感兴趣的事情有一个大概的想法,那么就可以在这个领域建立一个项目。
这一步看似很难,但没关系,这一步本来就充满了挑战。参加这样的项目有助于推动你成长,还可以让你学到很多知识,这些都可以直接转化为将来你的编程工作需要做的任务。
收获回报
到了这个阶段,你就可以辅导或指导年轻的程序员了。抓住一切机会,教别人的同时你也能学到新的东西。你可以考虑加入这个网站(https://code.org/)做义务教学。考虑教学?写博客怎么样?在职业生涯的后期阶段你也可以随时考虑如何回报社会!
初级程序员
到了这个阶段,你就拥有一些编码经验了,但还没有太多现实世界的编程经验。
诚实地问自己
你真的喜欢编程吗?这是我希望自己长期从事的事业吗?你可能不知道自己想要的究竟是什么,但如果你喜欢学习新技术、成长和解决问题,那么说明你选对了领域。
不管怎样,不要害怕退缩。如果你不喜欢做程序员,那么请诚实地面对自己,寻求更好地符合自己兴趣的不同道路。
回顾你的优点和缺点
为自己建立长期目标
另一方面,如果你喜欢编程,那么你希望自己往哪个方向发展?从事Web开发、嵌入式系统、物联网、还是软件开发?你不需要完全确定朝哪个方向发展,但是可以在路上每跨出一步就认真思考你是否要继续前进,在线课程或认证可以帮助辨别你的发展方向。
你可以尝试不同的领域,并找到自己感兴趣的领域。
专攻
熟练使用各种编程语言,努力成为专家——但不要试图掌握所有。问问你自己,你是否可以在工作中担任某个专业角色。如果你是自由职业者,那么客户会欣赏(并期望)你是某个具体领域的专家,而非广而不精。
举一个专业化的简单例子——Web开发中的可视化,就要求专注于前端(JS、React或其他),或者专注于后台(C#、PHP或Node等)。
渊博的知识储备
这要求你掌握一门以上的语言。举个例子,如果你从事Web开发,那么你需要掌握CSS、JS和HTML;如果你从事软件开发,情况也是如此。
你关注的东西越多,学到的就越多。
使用源代码管理
你需要熟悉源代码管理,并尽可能多地使用,因为在大多数公司中工作都需要使用源代码管理(除非假设你在银行工作)。
Git中的分支
说真的,上述提到的银行只是开个笑话,一定要好好学习源代码控制。
清楚何时提问
你可以在工作中学到该何时提问,但在正式参加工作之前,你可以阅读这篇文章(https://debugandrelease.blogspot.com/2018/11/how-to-approach-problem-you-dont-know.html)。
中级程序员
阅读,阅读,再阅读
这个阶段,你可以阅读有关编程、技术和你正在使用的语言的博客、新闻文章、播客和视频,还可以订阅博客或电子邮件简报。这里就是一个包含大量C#资源的网站(https://medium.com/@jakubgarfield/how-to-keep-up-to-date-as-a-c-developer-387bff208158)。
对于一门语言以及该领域(以及两者如何相互关联)的信息了解得越多,你就越有可能成为更加优秀的程序员。如果你想成为拥有更高能力的优秀程序员,那么这一点是必不可少的,所以一定要保持良好的习惯!
发现更多工具
发现持续性集成与持续性交付(即CI / CD,例如Jenkins,Visual Studio团队服务)和自动构建等工具,可以更好地提供自行建立API文档、IDE扩展、组件反编译器、管理虚拟机、不同风格的包管理器(Chocolatey和NPM)、看板等等功能特性。
当然,以上这些只是一些主要的工具(也是我个人比较偏爱的一些工具)。工具的发展瞬息万变,比如就在你读这篇文章的时候,可能就出现了新的工具(同时也有些工具被淘汰了)。
参加各种会议
通常,公司都会出钱让员工参加各种技术大会。这些会议可以为你提供整个技术领域更广阔的视野,以及创建了日常所用工具和软件的专业人士的深刻见解。这些会议由一群非常聪明的人组织和领导,你可以聆听他们的谈话,在满屋子的聪明人中间你可以表现得很谦虚。
VSLive是Windows / C#开发人员的会议
业余项目
你可以继续在Github上探索自己的兴趣所在。尝试创造任何你感兴趣的东西,而不仅仅局限于那些可能会赚钱的东西。建立一些你喜欢做的事情!以下几个简单的问题可以帮助你开始自己的业余项目:
我想解决什么问题?
我想学习哪些我现在不懂的知识?
汲取信息
从那些比你聪明的人那里汲取信息:向他们提问题;问他们为什么选择这种方式;问他们为什么选择那个框架;问他们你未能完全理解的知识......
但是,要注意火候。
掌握自己的领域
我希望到此为止你找到了某个自己可能感兴趣的领域。无论是电子商务,还是农业、时尚、制造,领域本身并不重要,重要的是你需要积极地走出去学习你所从事的领域。你不应该再继续一门心思地写代码,应该利用你的编程知识来解决某个领域的问题。
这就是为什么找到自己喜欢从事的职业非常重要的原因!
了解首字母缩略词与术语
比如SaaS、DRY、SRP、SOLID、PaaS、Blue/green......等等。一旦掌握了这些,你就可以看看如何应用这些术语,以及如何在编程时应用它们了。
改善你的工作记忆
如果你有以下特质,那么我确信你会是一名优秀的程序员:
逻辑思考的能力;
在限定时间掌握大量信息。
很明显,你需要理解逻辑(解决问题这一类的逻辑),但是如果你无法在脑海中记住大量信息,那么作为一名程序员你就无法更好地掌握你遇到的(更抽象)的问题。
我们的工作记忆力很有限,除非我们能够以某种方式清空我们的思想,否则我们根本就没有足够的脑力。为此,我有一个建议——哈希表记忆,它极大地帮助我的大脑获得了更多记忆空间。
通过这种记忆方式,我们不需要记住每个细节中的所有内容,而是只需记住信息的存储位置。
哈希表记忆
我倾向于写下来,并在一些媒体(笔和纸,.docx,在线博客,类似于Confluence的服务)上记录下我的知识。在下次需要回忆有关Powershell命令行的详细信息时,我只需要知道查看什么地方,而无需记住所有信息。
更多了解大厂商(PaaS,Iaas,Saas等)
到这个阶段的时候,你应该知道哪些是主要厂商,以及他们在做什么,但是你不需要成为像他们一样的专家。
举几个例子,比如 AWS、GCP和Azure。很可能你会在日常工作中使用其中一种产品,坦率地说,这是行业发展的方向。
如果你不喜欢使用在线平台,或者你身处一个保守的工作场所,那么你很可能仍然还在使用本地的服务。当负责超敏感数据(例如PCI或PHI)时,你也可以使用本地系统。
了解数据库
关系型和非结构化,这两种数据库结构你都需要了解(或者至少拥有其中一个模型的工作经验)。如果你使用大数据(Hadoop),那么数据库就更加不可或缺了。
高级程序员
掌握框架
为了你的职业生涯迈向下一个阶段,你必须清楚地了解你的框架。为此,你可以广泛地阅读互联网上的博客和文章,持续性地与他人交谈并分享这些信息。这个博客(https://blogs.msdn.microsoft.com/dotnet/tag/c/)上就是.NET框架的基本知识。此外,框架的学习同时还包括学习键盘快捷键。
在这一步中,你可以构建自己的解决方案(关于如何应用自己的知识,请参照下图的示例)。
构建应用程序解决方案
注重安全性
安全应该是所有应用程序的重要关注点。成为高级程序员后,你可能需要参与对安全与权限有一定要求的工作或项目,你需要了解OAuth、OIDC、基于会话或Cookie的身份验证、JWT以及一些活动目录的知识。你还应该考虑如何保护应用程序中的API密钥等的安全。
锻炼管理人员与项目的技巧
比如向老板传达项目状态、识别和管理阻碍项目进展的因素、组织项目范围、以及与利益关系人或非开发人员沟通等是你接下来必须掌握的技巧(虽然不必做到尽善尽美)。要注意你是生活在现实中的,这些事情避无可避。
与老板沟通
如果你是自由职业者,那么情况亦是如此!
听取反馈
我们都不想听到负面的反馈,但是忠言逆耳,你必须听取负面的反馈。询问你的同事、经理、或看过你代码的人的意见,你不一定需要他们给你严格的编程反馈,也可以询问是否有社交方面的问题可以改进——凡是有关个人的改进都可以让你提高自己的编程能力。
加速流程
通过shell自动化来加快你的速度。如果你工作的公司还没有建立好的实践,那么抓住机会自己动手创建脚本(使用shell脚本),或者按照正确(但更难)的方式执行脚本,并为你的团队构建一个有助于交付价值的流程。
承担复杂的工作
这与改善工作记忆密切相关,迫使自己接手越来越难的代码,会持续推动你的理解极限。
研究优化
你应该花一些时间学习优化。
对于C#来说,这包括异常、循环、字符串比较、ASCII、结构等等(https://www.dotnetperls.com/optimization)。掌握如何以及何时实现这些优化是普通程序员与优秀程序员的真正区别。
此外,想了解有关包装与解包装性能的更多信息,可以查看这个链接:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/boxing-and-unboxing。
资深程序员
事先说明,我还不是资深程序员,但是我很幸运能够与那些比我更聪明的人共事,这些人身上充满了资深程序员的特质。
选择妥协
在这个阶段,你所遇到的问题也许没有明显的正确或错误的答案,所以你必须选择一个不那么糟糕的选项。
举个例子,最近我与一位同事进行了一次这样的谈话。
当时他正在讨论在.NET Core Web应用程序中公开HttpContext的选项。问题是我们应该通过构造函数注入传递HttpContext,还是应该通过一个工厂(factory)访问HttpContext。通过构造函数传递HttpContext可以很好地提供代码,但是使用工厂可以提供额外的好处,例如自定义HttpContext类以及将来更容易修改(和添加)。
在这种情况下,HttpContext工厂需要创建成IServiceProvider调用的扩展,以关联依赖关系。按照这种方式创建的工厂将限制可以使用扩展的主机(webhosts),因为Web主机必须知道并使用IHttpContextAccessor。换句话说,如果应用程序切换主机,HttpContext工厂可能无法正常工作。
所以,最后我们得出的结论是,在这种情况下更好的选择是创建HttpContext工厂选项,因为应用程序主机不太可能会改变。
我们推断在这种情况下更好的选择是创建HttpContext工厂选项,因为应用程序主机不太可能会改变。
主题专家
成为无所不知无所不晓的专家。如果你还想继续探索未知的领域,那么可以考虑进入研究领域。
译者:诗书塞外
来源:https://spectrum.ieee.org/at-work/innovation/the-2018-top-programming-languages
版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。
精品课程推荐:
选购数学科普正版读物
严选“数学思维好物”
送给孩子的益智礼物 | 办公室神器
算法工程师成长阅读 | 居家高科技
理工科男女实用型礼物精选
----点击头像关注----
超级数学建模
数据与算法之美
少年数学家
数锐学堂
惊喜酱(个人号)
玩酷屋COOL