如何成为一个优秀的程序员

40次阅读

共计 1263 个字符,预计需要花费 4 分钟才能阅读完成。

优秀的程序员应该具备两方面能力:

良好的程序设计能力:

掌握常用的数据结构和算法(例如链表,栈,堆,队列,排序和散列);

理解计算机科学的核心概念(例如计算机系统结构、操作系统、编译原理和计算机网络);

熟悉至少两门以上编程语言(例如 C ++,Java,C#,和 Python);

专业的软件开发素养:

具备良好的编程实践,能够编写可测试(Testable),可扩展(Extensible),可维护(Maintainable)的代码;

把握客户需求,按时交付客户所需要的软件产品;

理解现代软件开发过程中的核心概念(例如面向对象程序设计,测试驱动开发,持续集成,和持续交付等等)。

和其它能力一样,程序设计能力和软件开发素养源自项目经验和书本知识。项目经验因人而异(来自不同领域的程序员,项目差异会很大);但书本知识是相通的——尤其是经典图书,它们都能够拓宽程序员的视野,提高程序员的成长速度。

在过去几年的学习和工作中,我阅读了大量的程序设计 / 软件开发书籍。随着阅读量的增长,我意识到:

经典书籍需要不断被重读——每一次重读都会有新的体会;

书籍并非读的越多越好——大多数书籍只是经典书籍中的概念延伸(有时甚至是照搬);

意识到这两点之后,我开始思考一个很功利的问题:如何从尽可能少的书中,获取尽可能多的关键知识?换句话说:

优秀的程序员应该掌握哪些关键概念?

哪些书籍来可以帮助程序员掌握这些关键概念?

这即是这篇文章的出发点——我试图通过程序员必读书单这篇文章来回答上面两个问题。

标准

进入必读书单之前,我先介绍下书单里的书籍选择标准和领域选择标准。当然你也点击这里直接跳转到书单开始阅读。

书籍选择标准

必读:什么是必读书籍呢?如果学习某项技术有一本书无论如何都不能错过,那么这本书就是必读书籍——例如 Effective Java 于 Java,CLR via C# 于 C#;

注意我没有使用“经典”这个词,因为经典计算机书籍往往和计算机科学联系在一起,而且经典往往需要 10 年甚至更长的时间进行考验;

注重实践,而非理论:所以这个书单不会包含过于原理性的书籍;

入门—必读—延伸:必读书籍的问题在于:1. 大多不适合入门;2. 不够全面。考虑到没有入门阅读和延伸阅读的阅读列表是不完整的——所以书单中每个关键概念都会由一本入门书籍,一本必读书籍(有时入门书籍和必读书籍是同一本),和若干延伸阅读书籍所构成。

概念选择标准

全面:全面覆盖软件开发中重要的概念;

通用:适用于每一个程序员,和领域特定方向无关;

注重基础,但不过于深入:优秀的程序员需要良好的计算机科学基础,但程序员并没必要掌握过于深入的计算机科学知识。以算法为例,每个程序员都应该掌握排序、链表、栈以及队列这些基本数据结构和算法,但计算几何、线性规划和网络流这些算法可能就不是每个程序员都需要掌握的了;

通过这几个标准,我把程序员应掌握的关键概念分为程序设计,软件开发,以及个人成长三大类,每一大类均由若干关键概念组成。

点个关注不迷路~C 语言 /C++/Linux 服务器开发等技术点 持续为大家分享~ 私信我回复“资料”有惊喜小彩蛋~

正文完
 0

如何成为一个优秀的程序员

40次阅读

共计 2362 个字符,预计需要花费 6 分钟才能阅读完成。

原文链接:https://medium.com/free-code-camp…
译者:前端技术小哥

是什么让真正优秀的程序员与众不同?

众所周知的是,优秀的程序员可以构建令人赞叹的功能、网站、应用程序等等。但是他们有什么共同点呢?
经过我的研究,这不仅仅只是熟练掌握一门编程语言或有特定的教育背景。真正有才华的程序员已经掌握了基础要素。这些基础要素使他们能够建立伟大事物,并提出突破性的想法。
想像一下金字塔,金字塔有一个很大的底座,然后越往上越小越薄。学习编程的基础知识就像建造金字塔的底部,一切都从底部开始。
那么这些基础要素都有些什么呢?根据我的经验以及我研究过的一些优秀的程序员,我认为编程基础要素主要有以下两部分。

解决问题的能力


首先,你必须做到能够高效的解决问题。这是一个关键的起点因为编程就是为了解决问题的。
虽然觉得问题的方法可以有很多,但过程中有几个部分让我印象深刻。拥有出色的解决问题的能力的程序员会先将问题的本质提炼出来,以便于确定总体目标并带着这个目标着手解决问题。然后他们将每个问题分解成容易处理的小问题,依次处理每个小问题,有时还可以通过绘制导图使其实现可视化。
这个过程做起来远比听起来难得多。当我开始学习编程的时候,我也会遇到瓶颈:和大多数人一样,我从未在学校学会如何解决问题,这也不是一项容易传授的技能,曾经,老师在数学课上布置了一组习题,我便一头栽了进去,正如我刚刚开始编程的时候。毋庸置疑,我这是在做无用功并且在最简单的问题就遇到了障碍。
当我开始学习如何解决问题甚至是高效的解决问题,情况开始发生变化。我开始去关注一个问题的最终目的是什么,得益于乔治·波利亚的书《如何解决这个问题》。
我把波利亚的一些想法运用到编程里,比如如何去理解问题。“这个问题必须被理解,”波利亚写道。这包括能够“指出问题的主要部分、未知、数据和条件。”对于每一个问题,我都拿出一张纸,然后写下这些问题的答案:我在解决什么问题,或者我在试图寻找什么?(未知);我现在有什么已知?(数据);我需要注意哪些限制条件或细节?(条件)。
理解这个问题对我们来说似乎是显而易见的,但显而易见的问题很容易被忽视。我不止一次在一个问题上投入了数小时但是毫无收获,过了一会才意识到这个问题,我错过了问题陈述中一个小而关键的细节。写下问题的细节虽然会让我的思维变慢,但是同时这帮助我准确地思考我需要做什么,这就已经成功的一半。
在此基础上,我也会制定了计划,这也是乔治·波利亚的另一个建议。我会在写文章之前先写提纲,画家在正式作画之前会先画一幅草图,建筑商用图纸和蓝图来建造房屋,编程也一样。与其急着去做,我还不如先想好我要做什么,然后制定一个计划。
具体的实施方法有很多种。有时我用数字的顺序列出我需要采取的步骤:第一件事做这个,第二件事做那个。有时候我也可以把问题可视化,当我学习 for loops 的时候,我拿出一把杏仁,在这堆杏仁中进行物理循环。这个例子听起来很幼稚,但它能很好的帮助我思考了这个问题。
我也会画一些示意图。对于递归问题,我会绘制图表来说明每次递归调用时发生的情况,直到递归完成为止。我会想办法如何去简化问题,使其更易于处理,并帮助我发现一个合适的解决方法。最重要的是,我是带着目的性去进入一个问题,并在解决问题的过程中始终保持着这种目的明确的感觉。
有时尽管制定了最好的计划,问题仍然很难被解决,我还是有可能没有思路。成为一个高效的问题解决者需要时间;我仍在努力的学习这个技能,这是绝对值得的。
当我阅读由一个优秀程序员编写的代码时,最直观的感觉就是它很干净,很容易理解。变量被很好的命名,函数简单明了,每一行代码都有特定的用途。代码的清晰性度反映了程序员的思考过程:我可以从头到尾阅读程序,并确切地知道发生了什么。这是很棒的解决问题的方法,也是我所追求的。

掌握计算机科学


学习计算机科学是编程基础的第二部分。我最近开始学习计算机科学,并且喜欢它,因为学会了这些就能站到比别人更高的地方去看问题。比如我开始从幕后的角度去了解使用内置函数时会发生什么。我还学习了内存和运行时间等许多其他主题。简而言之,我正在学习计算机为什么要做它所做的事情。
明白“为什么”让我对前后关系理解更深刻,帮助我成为一个见多识广的程序员。因此我在编写代码时更加深思熟虑。现在我对时间复杂度有了一些了解,举个例子,我更倾向于使用二分查找,而不是遍历列表中的每个元素。
这也丰富了我对于核心编程概念如何运作的理解。打个比方,曾经我在研究一个递归问题,但没有得到我预期的结果。经过仔细审视,我明白了原因:这与调用堆栈的执行有关,几个月前的我并不知道这个。
学习计算机知识也帮助我去使用类。对于类,我苦苦挣扎了很长一段时间,也不敢使用它。我知道如何编写类,但不确定什么时候用,为什么用。当我了解到当我的计算机中创建实例和调用方法时实际发生的事情时,情况就发生了变化。当我有了一些相关知识之后,我就敢使用类了。对于递归和类,计算机科学填补了我知识上的空白。
所有这些基础要素往往都被抛到一边。进步是缓慢的因为人们往往倾向于选择有趣的工作当他们有选择的余地的时候。这太可惜了。而掌握基本要素的程序员似乎对编程充满信心:他们清楚的知道他们的编程时的“如何”和“为什么”,这改进了他们的工作并增强了他们在其他人的面前的可信度。
另外,扎实的基础知识使学习新的编程语言和技术没那么困难。例如,花时间真正理解一种编程语言的核心概念像迭代、递归和抽象这样的核心概念有助于学习另一种语言。简单地说,掌握了基本知识,将会获益匪浅,几乎没有什么损失。

❤️ 看之后

  • 点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
  • 关注公众号「新前端社区」,号享受文章首发体验!每周重点攻克一个前端技术难点。

正文完
 0