虽然前面讨论了很多编写代码的方法,但优秀的代码最终还是出自优秀的软件工程师。本节介绍如何成为一名优秀的软件工程师。

首先澄清几个误区,一名优秀的软件工程师和以下因素没有必然联系。

(1)写了多少年程序。

(2)写了多少行代码。

(3)曾经在哪里上学,曾经在哪里工作。

我将一名优秀软件工程师的修炼方法总结为以下三句话

(1)学习—思考—实践。

(2)知识—方法—精神。

(3)基础乃治学之根本。

下面将对这三句话做详细解读。

路径一:学习—思考—实践

1. 学习

对于一名软件工程师来说,学习是非常重要的事情。

软件编写的历史已经超过半个世纪,有太多的经验可以被借鉴。非常遗憾的是,很多软件工程师虽然工作多年,但是却没有对前人和大师的经验进行过充分学习,在很多方面没有使用正确的方法。

在学习途径方面,我推荐大家优先阅读相关图书。很多软件工程师主要通过阅读博客或微信公众号上的文章来学习,其实很多内容质量远不如经典图书。另外,我还建议大家选择一些高质量的开源代码来研究,以提升自己在阅读代码方面的品位。

有些读者对于持续学习缺乏足够的动力。这里我想到苹果创始人乔布斯的一句话:

Stay hungry, stay foolish.(求知若饥,虚心若愚。)

也就是说,只有自己感觉到“饥饿”和“愚笨”,才会去学习。

关于学习,希望读者养成“学习的习惯”,以及培养好“学习的能力”。我曾做过多次调研,发现很多人在一年内阅读的图书不超过两本,这远远少于大家在大学时的阅读量。在一个不断发展的社会里,如果5~10年不学习,一个人很快就会“过时”。

建立起不断学习的习惯很重要。我还发现有一些人不会学习,对于所阅读的内容抓不住重点,这就是“学习能力”比较薄弱,建议大家可以看看《如何阅读一本书》,书中深入地介绍了正确而高效的阅读方法。

2. 思考

古人说,学而不思则罔。

即使学习了一些知识和方法,也获得了一些实践的机会,但是如果不去思考,就不能形成自己的思想体系,这就相当于白学和白干。

一方面,在经过思考之前,所学到的知识或方法还只是外在的,如果不能在思考的基础上去深入理解,就很难灵活地在工作中使用;另一方面,现实情况经常和书本中的内容有一些差异,需要在工作中通过思考来判别差异,总结经验,形成符合实际情况的方法论。

3. 实践

在学习和思考的基础上,还要勇于实践。

有些读者在经过学习和思考后知道了什么是好的方法,但是在面对工作中的问题时,却仍不敢去实践。

在实践中,我们需要有“知行合一”的精神。以前,北京大学有位老师叫汤一介,关于“真、善、美”曾做过一个总结,我认为总结得特别好:

天人合一,谓之真;知行合一,谓之善;情景合一,谓之美。

从我的经验看,所有的进步都来源于失败的经历和遭遇过的挫折。没有哪个方法是经过一次学习就可以马上掌握的,所有成功的方法都需要在实践中不断体验和调整。一个人的学习速度,从某种意义上决定于他犯错的速度,在这方面成年人反而不如小孩子。小孩子学说话学得很快,就是因为这是一边犯错、一边纠正的过程,小孩子学走路也是一样。成年人怕犯错,所以往往不敢尝试,学习的速度也就慢了下来。

路径二:知识—方法—精神

1. 知识

对于认为“软件工程师只能工作到35岁”的人,其中一个论据就是软件工程师经常需要学习,担心年龄超过35岁之后就学不动了。

如果只是学习新知识,确实如此。在这个知识大爆炸的时代,知识是过时最快的。对于软件工程师来说,由于不断涌现出新的编程语言、新的系统、新的概念……,所以只学习知识的人,总是感觉世界变化太快。

如何解决这个问题呢?这需要我们不仅仅要学习知识,而且要学习方法。

2. 方法

如果我们从“方法”这个角度来看待世界的变化速度,就会发现其实变化速度并没有那么快。我在本书中介绍的内容,在很大程度上都不是新知识,而是在20多年前就在学校学过的,它们至今仍没有过时。有些方法,历经几千年都不会过时,比如《老子》中介绍的方法,虽然只有几千字,但却能给人留下深刻的印象。

相对于“知识”,“方法”这个词总是让很多人感到很“虚”。但是这个“虚”(的方法)可能比那个“实”(的知识)更有价值。最深刻的方法其实是不可言传的,正如《老子》中的一句话:

道可道,非常道。

(如果“道”可以说出来,就不是永恒的“道”了。)

对于软件工程师来说,分析问题、解决问题的能力才是最重要的。其实,这就是“研究”的能力。

关于“研究”,20多年前加州理工学院的Steven Low老师曾在给我的一封邮件中给出过一个很好的定义:

To Identify the Fundamental Problem, and Solve it.

(去识别、定义那些最重要的问题,并解决。)

3. 精神

即使有了知识和方法,To be or not to be永远都是一个问题。前进的路上往往不是鲜花和掌声,而是困难和荆棘。人类总是在神性和兽性间不断斗争,进步往往来自对理想的追求。

关于精神层面,这里送给大家三句话,供参考。

(1)独立精神,自由思想。这是清华大学的陈寅恪为纪念王国维所写的碑文中的一句。这块碑位于清华大礼堂附近的第一教学楼旁边。我一直认为这是清华大学“自强不息,厚德载物”之外的另一个重要校训。

(2)Don’t follow(不要跟随)。这是20年多年前UCLA(University of California, Los Angeles,加州大学洛杉矶分校)的张丽霞老师送给我的一句话。当时我向张老师请教应该如何做研究,张老师的这句话令我印象深刻。

(3)对完美的不懈追求。“完美”永远是一个可望而不可及的目标。对于“完美”,我们需要不断去追求。

路径三:基础乃治学之根本

有些软件工程师在发展到一定阶段后,会感到继续提升很困难。对于一些规模稍大的项目,他们会感觉把握不住;对于一些方向,会感到无法持续深入。其实这些都是因为之前的基础没有打好。

于敏是2014年国家最高科技奖得主,中国氢弹元勋。于敏特别喜欢诸葛亮在《诫子书》中的格言,将其视为座右铭:

非宁静无以致远。

他也非常喜欢魏征谏唐太宗的两句话:

求木之长者,必固其根本;欲流之远者,必浚其泉源。

他深知基础乃治学之根本。

对于软件工程师来说,需要具备的基础能力如下。

(1)计算机学科的基础知识和方法,包括:数据结构、算法、操作系统、系统结构、计算机网络等。

(2)软件研发的相关知识和方法,包括:基础的软件编写方法、软件工程方法、编程思想等。

(3)基本思考能力和沟通能力,包括:逻辑思维能力、归纳总结能力和表达能力等。

(4)研究能力,主要是分析问题和解决问题的能力。

对于一名软件工程师,以上这些基础的建立至少需要5~8年之功。

通过本文,希望大家对“软件工程师”这个职业建立起正确的认识。软件工程师不等于“码农”,软件工程师不能只知道怎么编写代码,还需要具备非常综合的能力。

(1)代码可以是艺术作品,也可以是“垃圾”,关键在于编写代码的人。希望大家都能朝着艺术家的方向努力,努力把自己的代码变为艺术品。

(2)不要忘记我们为什么出发。我们的目标是改变世界/格物致知,而不是学习编程或者炫耀技术。最开始我认为,写代码的目标是“改变世界”,但是后来我改变了想法,将目标转变为“格物致知”。其实,我们工作和生活的更主要的目的是增加对这个世界的理解和认识。如果写了多年代码,但仍然对写代码的“道”没有了解,那么时间和生命就浪费了。

(3)好代码的来源不是写好代码。好代码是一系列工作的结果,包括需求分析、系统设计、编码、测试、上线和运营等。

(4)代码是写给别人看的,而不是能正确运行就可以了。对一名软件工程师来说,写出别人看不懂的代码则是失败的。

(5)写好代码是有道的。通过系统而持续的学习、思考,以及实践正确的方法,我们自己也可以打造出精品。一名优秀的软件工程师的养成至少需要8~10年的积累,大家需要摒弃浮躁的心态。

本文节选自《代码的艺术:用工程思维驱动软件开发》一书,想要了解更多相关内容,欢迎阅读本书!

下单即减50,快抢!

 

如果喜欢本文
欢迎 在看丨留言丨分享至朋友圈 三连

往期推荐

好代码和坏代码

大疆再遭制裁,设计软件Figma断供!中国工业软件如何应对全面封禁?

美团搜索多业务商品排序探索与实践

社会内卷的真正原因?华为内部论坛的这篇雄文火了

漫画:如何用 K8s 实现 CI/CD 发布流程?

中美程序员不完全对比,附乌俄程序员薪资待遇

史海峰:我的架构师修炼之道

一年之计:如何构建知识体系?

创业公司是如何进行研发管理和绩效考核的?

图胜千言:电商支付架构设计

千万级流量的大型分布式系统架构设计

技术转管理,用什么来拯救自己?

40岁从零开始学习软件开发,四年后我成了首席研发

一张图看懂微服务架构路线

如何写出让人抓狂的低质量代码?

入行二十年的一些认知

微信支付架构为什么这么牛?

设计抗100亿请求的春晚红包系统

DDD权限平台建模与实战(附代码)

从西安一码通崩溃,看千万级DAU系统该如何设计

成为优秀软件工程师的三条路径相关推荐

  1. 写给软件工程师的 30 条建议

    经验都是在生活中不断积累中获得的......本文作者将回顾人生的历程,并将软件工程师的工作和生活公之于众. 作者 | Periklis Gkolias 译者 | 弯月,责编 | Elle 出品 | C ...

  2. 过来人写给软件工程师的 30 条建议

    就在几天前,我的人生迈入了30岁.在过去的十年中,我做了很多事情,也学习了很多东西.在本文中,我将回顾人生的历程,并将软件工程师的工作和生活公之于众. 下面,让我们进入正题. 1,努力工作 没有人会平 ...

  3. 我理解的优秀软件工程师

    最近越来越多人的在谈论 全栈工程师 (full stack),从某种意义上来说,一个优秀的工程师,必然是一个全栈工程师,或者至少一两种跨语言.平台工作的能力. 就我个人的理解,来探讨一下如何定义一个优 ...

  4. 根据你对优秀软件开发者(优秀软件工程师)的观察和认识,说出三个共同的个人特质(优秀品质),试举例。

    1. 具有很强的分析思维 作为一名优秀的开发者,你需要思考,观察数据,记忆并且分析这些现象和内容,并解决问题.虽然这一点有些抽象,但很不幸的是这是非常重要的一点.为什么很不幸呢?因为这一点意味着不是每 ...

  5. Android开发必须会的技能!写给安卓软件工程师的3条建议,Android岗

    前言 首先介绍一下自己,计算机水本,考研与我无缘.之前在帝都某公司算法部实习,公司算大公司吧,然而个人爱好偏开发,大二的时候写个一个app,主要是用各种框架. 在开始复习知识点前,要确认以下 2 点: ...

  6. android音视频开发!写给安卓软件工程师的3条建议,已整理成文档

    前言 Android高级架构师需要学习哪些知识呢? 下面总结一下我认为作为一个资深开发者需要掌握的技能点. 从初中级到高级,移动端程序员的进阶宝典 想要成为一名优秀的Android开发,你需要一份完备 ...

  7. AI人工智能开发的路径有三条,最成功的是机器学习技术:强化学习

    https://www.toutiao.com/a6683382168732828174/ 2019-04-24 16:56:12 阿尔法围棋(AlphaGo为什么能够成为第一个击败人类职业围棋选手. ...

  8. 一看就懂→专票电子化的三条实现路径

    谁说国庆过后就没有节日了,这个周末就是程序员节了,尽管杨斯维特自己不是程序员,但想到日以继夜.又夜以继日把我coding出来的小哥哥小姐姐们要过节,想想还是有点小激动呢! 然后再过一阵子又是双十一了, ...

  9. 成为软件工程师之前,你必须了解这些

     编者按:所谓知己知彼,方能百战不殆.无论是面临就业的大学生,还是考虑再择业的职场人,都离不开一个清晰的职场目标并为之不懈的努力. 软件工程师篇: 软件工程师的工作在最近几年变得尤为紧俏,那么,如 ...

  10. 成为一流软件开发者的 34 条建议

    点击上方"逆锋起笔",公众号回复 pdf 领取大佬们推荐的学习资料 本文来源:http://r6d.cn/qGAu 我们列出了一张包含 34 条建议的清单,来帮助你成为一流的软件开 ...

最新文章

  1. ARM汇编:使用汇编语言进行数据访问时需要注意的几个问题
  2. Spring4 学习系列之——jdbc事务的基本实现和了解
  3. Microsoft Fluent Design System
  4. 剑指Offer - 面试题59 - II. 队列的最大值(deque模拟单调栈)
  5. 1,日志组件XLog
  6. “Talk is cheap, show me the code”你一行代码有多少漏洞?
  7. 如何为项目配置opencv
  8. 77页智慧应急解决方案 2022
  9. 基于TVUE框架在中型移动端项目的直出同构实践
  10. 服务器win2003修复,win2003服务器svchost.exe异常
  11. html如何删除目录,无法删除文件夹 目录不是空的
  12. 海思Hi3516CV500/Hi3516DV300处理参数比较
  13. 快速傅立叶变换的C语言实现方法
  14. 分析早期关节炎队列发现冬春季发病者的短期放射学进展更重
  15. 作文 深海机器人_海底机器人作文500字
  16. Qt编写视频播放器(支持pbonon/qmediaplayer/ffmpeg/vlc/mpv等多种内核)
  17. 常用markdown语法
  18. 微前端之实践环境变量设置、快照沙箱隔离、代理沙箱隔离、css 样式隔离、父子应用间通信和子应用间通信
  19. C语言写字母图形(蓝桥杯)
  20. 带你玩一玩--> jQuery(一)

热门文章

  1. 神仙道玄奇套装材料大全
  2. OCCT示例学习笔记3--Modeling项目
  3. Linux安装glassfish、利用glassfish部署应用
  4. 游戏中常见的Bug也有你不知道的秘密
  5. 支持向量机算法+数据读取+多倍交叉验证实现
  6. 详解物理学四大神兽————芝诺的乌龟
  7. 如何成为优秀的软件人才
  8. Docker加速器 DaoCloud
  9. 微吼林彦廷:当直播成为一门显学
  10. python练习-华氏转摄氏