0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

入行 14 年,我还是觉得编程很难:给大项目写代码没意思还危险

innswaiter 来源:van 作者:van 2023-02-23 14:34 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1写代码很简单,但写好代码很难

编程曾经是一项门槛很高的专业技能。从前,一个普通人想学编程,最常见的做法就是通过教材和书本学习。不过大部分编程专业书,十分艰深晦涩,对于初学者来说很不友好。因此不少人在尝到编程的乐趣前,就早早地半途而废。

但如今,学编程正在变得越来越容易。学习不再像以前那样,只能硬啃书本,而是多了许多新途径。观看教学视频、参加 Codecademy 的交互式课程,甚至直接在 CodeCombat 通过玩游戏来学编程,每个人都能找到适合自己的学习方式。

poYBAGP3COCAdUCvAAn4Dz_b0VI747.jpg

“妈,我真没在玩游戏,我在学编程呢!你看屏幕右边!”

此外,编程语言也在变得越来越易用。经典的 C 和 Java 不再是大多数初学者的首选,许多更简单、更易上手的动态类型语言如今大受欢迎,与之相关的 IDE 等工具也变得越来越完善。这些因素进一步降低了编程的学习门槛。

总而言之,编程早已褪去了它的神秘面纱,从只有少数人才能掌握的神秘技能,变成了一门人人皆可学习的普通手艺。

但更低的学习门槛、更友好的编程语言,并不意味着人人都能写出一手好代码。如果你已经工作,参与过一些项目,那我很想问你一个问题:”你日常接触的这些项目的代码质量如何?是好代码多,还是烂代码多?”

不知你会怎么回答,我先来说说我的答案。

好代码还是很少

2010 年,我跳槽到了一家总部位于北京五道口的大型互联网公司。

加入这家公司前,我只在十人规模的小公司待过,因此,我对新公司在各方面都有着很高的期待,尤其是软件质量方面。当时,我心里想的大概是这样:“这可是支撑了有着千万用户量的产品的‘大’项目,代码质量跟之前那些比,肯定有质的飞跃吧!”

等到在新公司工作了一周后,我才发现自己实在是错得离谱。所谓“大”项目的代码质量同我的预期相去甚远。打开 IDE,数百行的函数和神秘的数字字面量比比皆是,开发任何一个小需求都难如登天。

后来,在待过更多公司,接触了更多软件项目后,我总结出一个道理:不论公司多大、项目多牛,在实际工作中遇见好代码,仍然是小概率事件。

好代码有哪些要素?

话说回来,到底怎样的代码才算是好代码?在这方面,Martin Fowler 有一句话常被大家引用:

“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.”

“任何傻瓜都能写出计算机能理解的代码。优秀程序员写人类能理解的代码。”

我认为它可以作为评价好代码的原点:好代码一定是可读、易读,且容易理解的。写出好代码的第一原则,就是把人类读者放在第一位。

除了可读性以外,评价代码好坏还有许多其他维度:

贴合编程语言:是否使用了当前编程语言的推荐写法?语言特性和语法糖,使用程度是否恰到好处?

贴合编程语言:是否使用了当前编程语言的推荐写法?语言特性和语法糖,使用程度是否恰到好处?

易于修改:代码设计是否考虑了未来的需求变更,当变化发生时,代码是否容易随之修改?

API 设计合理:API 设计是否合理,易于使用?好的 API 在简单场景下使用方便,在高级场景下又可以随需求扩展。

性能够用:代码性能是否满足当前业务需求,同时为未来保留了一定提升空间?

避免过度设计:代码是否存在过度设计、过早优化的毛病?

总而言之,对于任何层级的程序员来说,好代码都不是什么唾手可得的东西。要写出好代码,需要在许多维度上反复权衡、精心设计,最后再加以持续打磨。

既然如此,假如想尽快掌握写代码这门手艺,有捷径吗?

写好代码的捷径

在许多层面上,我认为编程和写作非常相似。二者都是使用文本和符号来表达思想,只是方式略有不同。

谈到写作,我想问一个关于作家的问题:“你听说过不读书的作家吗?你有没有听到过某位作家说,他从来不读其他人的作品,只读自己的东西?”。我猜答案应该是否定的吧。

如果你去查阅相关资料,你会发现许多职业作家的日常生活,就是阅读和写作两件事在不断循环。他们每天会花大量时间阅读各类文字,然后再写作。

同样是“文字工作者”,程序员们就很少重视阅读。但要想快速提升编程能力,阅读正是不可或缺的重要一环。除了日常工作接触到的项目以外,我们应该更多地阅读那些经典软件项目,从中学习 API 设计、模块架构和代码编写的技巧。

不光代码和技术文档,最好再定期读一些计算机方面的专业书,保持阅读书籍的习惯。在这方面,我认为 Jeff Atwood 在 15 年前写的文章 "Programmers Don't Read Books -- But You Should(都说程序员不读书——但你应该读)",如今读来仍不过时。

提升编程能力的捷径,就藏在“阅读 <-> 编程”这个无尽循环里。

pYYBAGP3COCABS1bAAKFHuxPAXY696.jpg

“一个好的程序员应该做什么?”

2编程的精髓是“创造”

在程序员的日常工作中,有很多事情会让人充满成就感,甚至情不自禁地感叹“编程真美好”。比方说,修复了一个极难定位的 Bug,用新算法将代码性能提升了一倍,等等。但在所有的这类事情当中,没有任何一件,能和“亲手创造出一件东西”相比。

当你在编程时,创造新事物的机会实际上随处可见。因为并非只有发布一个新软件,才称得上是“创造”。写一个可复用的工具函数、设计一套清晰的数据模型,全都可以归入“创造”的范畴。

身为程序员,保持对“创造”的热情至关重要。因为它可以帮我们:

更高效地学习:学习一门新技术,最高效的方式就是用它开发一个真实项目,在创造的过程中学习,效果最好。

有机会邂逅了不起的东西:许多改变世界的开源软件,最初都是作者纯粹出于兴趣所创造,比如 Linus Torvalds 和 Linux,Guido van Rossum 和 Python

pYYBAGP3COGAQ0yTAApfX6lPdkk783.jpg

1989 年的圣诞假期,荷兰人 Guido van Rossum 敲下了 Python 语言的最初几行代码,Python 最初仅被期望作为 ABC 语言的继承者,但后来“吞噬”了全世界

虽然“创造”好处多多,程序员们也有大把机会去做,但许多人常常缺少一种身为“创造者”的觉悟。就像那个广为流传的小故事所说:一位哲学家询问正在砌砖的工人,有人清楚地知道自己是在建造一座大教堂,有人却认为自己只是在砌砖。很多程序员正是“只见砖块,不见教堂”。

将自己定位成创造者后,看待事物的方式就会发生天翻地覆的变化。举个例子,同样是给 API 增加报错提示文字,创造者们就能跳出“快速完成需求就好”的思维陷阱,向前一步,追问自己一些更重要的问题:“我想为用户创造什么样的产品体验?怎样的报错文字,更能帮助我达成该目标?”

就像任何一个有用的编程模式一样,“创造者思维”也能成为你的职业生涯的一道巨大推进力。因此,现在就试着问自己一个问题吧——“我的下一份创造会是什么?”

3打造高效试错的环境至关重要

我曾参与开发过一个互联网产品,它设计精美、功能丰富,每天都有大量用户使用。

但就是这么一个从市场角度看颇为成功的产品,工程质量却非常糟糕。如果你打开它的后端项目,把所有目录翻个底朝天,都找不到任何一行单元测试代码,其他自动化测试流程也是无从谈起。而业务逻辑偏偏又十分复杂,最后,项目代码间的意料耦合多如牛毛,开发一个新特性很容易把旧功能给搞挂。

poYBAGP3COGAYkHiAAFCPWqDTqs852.jpg

“在忙啥呢?” “试着修复我之前修一个问题时搞出来的问题,那问题是我之前解决另一个问题搞出来的,而那个问题又是我……”

因此,项目每次发布时,开发和产品同学全都得严阵以待,氛围十分紧张。整个发布过程也很刺激,紧急回滚时有发生。一个人在这样的环境中工作,技术成长抛开不谈,心理素质肯定能得到极大锻炼。

编程原本是一件充满乐趣的工作,但为这样的项目编程,乐趣根本无从谈起。究竟是什么夺走了编程的乐趣?

理想的编程体验≈“刷题”

LeetCode 是一个著名的编程学习网站,上面提供了许多覆盖各个难度的编程题,大部分与算法相关。用户可以选择自己感兴趣的题目,直接在浏览器上编写代码(支持十几种编程语言)并执行。如果通过了全部的测试用例,则算作解答成功。

pYYBAGP3COGAQHcCAAI9shPzEEQ988.jpg

在 LeetCode 上做题

在 LeetCode 刷题很像在玩游戏,富有挑战性,同时也很有趣。整个做题过程,实际完美展现了一种理想化的编程体验:

关注点分离:每道题目都是一个独立个体,同一时间内,开发者可以完全沉浸在一道题目中;

快速获得精准反馈:开发者每次调整代码后,能通过自动化测试快速获得结果反馈;

零成本试错:写出的代码语法有错误、逻辑有问题,没有任何不良后果,心理负担小。

不过,屏幕前的你很可能觉得我在说些废话。

“不然呢?解算法题、写小脚本,不就是这样的体验吗?有啥特别值得说的?”你很可能会继续补充道,“你知道我们公司的项目有多复杂吗?规模超大,模块巨多,你懂我意思吗?每天服务 ××× 万人,光数据库就好几套,消息队列都有三种,开发起来当然要麻烦一点咯!”

确实,全世界的软件千差万别,开发起来不可能都像在 LeetCode 上刷题一样轻松愉快。但这并不意味着,我们不应该努力改善自己身处的编程环境,哪怕只有一点点。

要通过改善环境来提升编程体验,可用的理念和工具包括:

模块化思想:妥善设计项目中的每一个模块,降低耦合,提升正交性

设计原则:微观层面上,应用那些经典的设计原则和模式,比如“SOLID”原则

自动化测试:编写规范的单元测试,必要时使用 Mock 技术,用自动化测试覆盖业务关键路径

缩短反馈回路:切换编译速度更快的工具,优化单测性能,竭尽全力缩短从“改完代码”到“获得反馈”的等待时间

微服务架构:必要时,将大单体拆分为多个职责各异的微服务,分散复杂度

……

关注编程环境,刻意创造出允许高效试错的“代码乐园”,让工作像刷题一样轻松愉快。是经验丰富的程序员能为自身团队做出的最好贡献之一。

4避开代码完美主义陷阱

在代码质量上精益求精是好事,但也要注意别掉进完美主义的陷阱。因为编程不是艺术创作,不鼓励人们无限度地追求极致。作家大可花上数年打磨一本传世之作,但程序员在代码上钻牛角尖就很有问题。

世间没有完美的代码。大多数时候,你的代码只要能满足当前需求,又为未来扩展留了一些空间就够了。有那么几次,我在简历上看到候选人给自己打着“代码强迫症”标签。隔着屏幕,我虽能感受到 TA 对代码质量的那份重视,但在我心底,其实更期望 TA 早已将完美主义陷阱远远甩在了后头。

5技术很重要,但“人”也许更重要

在软件开发领域,“单一职责原则”(全称为 Single responsibility principle,后简称为 SRP)是一条非常著名的设计原则。它的定义很简单,一句话就可以概括:“每个软件模块应该只有一个被修改的理由”。

poYBAGP3COKAQaHhAAS5kCkPhtE317.jpg

单一职责原则:能做到,并不意味着你就该这么做

要掌握 SRP 原则,关键在于搞清楚“被修改的理由”为何物。很显然,程序是没有生命的,它自身不能也不需要主动去改变。任何修改程序的理由,都来自与之相关的人,人是导致修改的“罪魁祸首”。

举个简单的例子。看看下面这两个类,其中哪一个违反了 SRP 原则?

一个字典数据类,支持两类操作:存数据、取数据;

一个员工资料类,支持两类操作:更新个人信息、渲染一张用户资料卡片图。

在大多数人眼里,第一个例子没问题,但第二个例子却明显违反了 SRP 原则。要得出该结论,好像无需任何严格的分析和证明,运用一丁点直觉即可。但假如做一些正经分析,第二个例子的可疑之处,在于能为其轻松找出两个不同的修改理由:

管理员认为资料中的“个人电话”字段不能有非法号码,需增加简单的校验逻辑;

某员工认为资料卡片图上的“名字”部分太小,希望加大字体。

”It is people who request changes. And you don’t want to confuse those people, or yourself, by mixing together the code that many different people care about for different reasons.” ——“The Single Responsibility Principle”

“是人在要求软件变更。你绝不想把那些不同人出于不同原因所关心的代码混在一起,这样只会把他们和你自己搞糊涂。”——“单一职责原则”

理解 SRP 原则的关键,在于先理解人以及人在软件开发中所扮演的角色。

再举一个例子。微服务架构是近些年很火的一个技术话题。但许多人在讨论它时,往往只关注技术本身,却忽视了微服务架构与人之间的关系。

将微服务架构风格与其他东西区分开的关键,在于将大单体拆分为独立的微服务后,不同模块间的边界可以变得更清晰。跟数百人的团队一同维护着一个大单体比起来,许多小组织各自维护着独立的微服务,明显拥有更高的运作效率。

如果缺少了特定的组织规模(也就是“人”)作为前提,空谈微服务的各种技术优势和那些花活,纯属本末倒置。

技术当然很重要。身为技术人员,那一张张瑰丽的架构图和独具匠心的代码细节,天然吸引着我们的注意力。但是,也请千万不要对软件开发里的另一个重要因素“人”视而不见。必要时,转换一下看事情的角度(从“技术”转向“人”),那样对你大有裨益。

6求知若渴是好事,但也要注意方法

如今人人都在说“终身学习”,而程序员是一个尤其需要终身学习的职业。因为计算机技术的迭代更新非常快,某个三年前流行的框架或编程语言,很可能一个月前已经过时。

pYYBAGP3COKAQq5jAATF4fum3p0532.jpg

一分钟之内会发生什么事情?Netflix 观看时间增长 70,000 小时;Snapchat 上有三百万视频被观看;Google 新增两百四十万次搜索;一个 JS 新框架被发明(这条不是真的


审核编辑黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    90

    文章

    3723

    浏览量

    97430
  • 代码
    +关注

    关注

    30

    文章

    4976

    浏览量

    74358
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    甘肃2.15GW/8GWh储能项目集中落地,安科瑞EMS3.0助力新型储能高效运营

    引言 20263月20日,甘肃省发展和改革委员会正式发布2026省列重大建设项目名单。这份备受关注的项目清单中,储能相关项目
    的头像 发表于 03-20 15:38 214次阅读
    甘肃2.15GW/8GWh储能<b class='flag-5'>项目</b>集中落地,安科瑞EMS3.0助力新型储能高效运营

    2026各省市传感器重大项目公布:含12英寸芯片产线、产业园等(附全名单)

        2026是我国“十五五”计划的开局之年,各省市在开春之际,纷纷发布重大项目计划和清单,重大项目作为省市经济发展的重要支撑点,在这个关键节点更受关注。   据相关统计,截止2月27日,全国
    的头像 发表于 03-02 17:59 179次阅读
    2026<b class='flag-5'>年</b>各省市传感器重<b class='flag-5'>大项目</b>公布:含12英寸芯片产线、产业园等(附全名单)

    思必驰参与国家重大项目顺利通过中期验收

    近日,由上海交通大学牵头,联合中国科学院微电子研究所、华为技术有限公司、中国信通院、北京理工大学及思必驰共同承担的国家科技创新2030“脑科学与类脑研究”重大项目——《支持在线学习的类脑芯片架构》顺利通过中期验收。
    的头像 发表于 02-24 10:03 812次阅读

    南方遥感中标环天智慧重大项目

    近日,南方测绘集团旗下南方遥感,凭借在遥感数据处理领域领先的综合技术实力,成功中标环天智慧科技股份有限公司“环天智慧数据服务支撑体系与业务运行设施新建项目(一期)”项目,中标金额4500余万元。双方将共同助推遥感数据产业化发展和智能化应用。
    的头像 发表于 12-26 16:32 1653次阅读

    代码里的青春——与RT-Thread的故事

    的故事,与各位小伙伴分享。如果你也有故事,那么请一起参与进来——你的代码岁月,值得被记录!悟空的故事RT-Thread相伴,共赴五时光之约邂逅期初入行时,对未知充满
    的头像 发表于 12-12 20:11 1231次阅读
    <b class='flag-5'>代码</b>里的青春——<b class='flag-5'>我</b>与RT-Thread的故事

    就是那个32岁还在点点点的测试狗!

    2019入行,如果你问我有没有后悔选测试这条路,说实话,有也没有。工作前两几乎是在混日子,完全没方向,机械点点点、提bug,和现在刚入行
    的头像 发表于 12-12 10:02 430次阅读
    <b class='flag-5'>我</b>就是那个32岁还在点点点的测试狗!

    哪些 AI 编程工具能够根据项目需求进行定制?企业级研发场景的能力评估与实践趋势

    随着软件工程快速向自动化、智能化演进,AI 编程工具已经从“辅助代码”,走向“理解工程”“参与项目”“按需求定制流程”的新阶段。对于许多处于数字化和全球化进程中的企业而言,选择一款能
    的头像 发表于 12-08 16:10 808次阅读

    那些用OpenCV+Qt趟过哪些坑?写给视觉应用开发者的避坑指南

    前阵子,团队里新来的小伙子跑来找我,眉头紧锁。他手里的项目清楚:一个基于摄像头的简单计数工具。Demo阶段用Python+OpenCV,几行代码跑得飞快,准确率也好看。可一旦要打包成
    发表于 12-02 09:43

    那些用OpenCV+Qt趟过哪些坑?写给视觉应用开发者的避坑指南

    前阵子,团队里新来的小伙子跑来找我,眉头紧锁。他手里的项目清楚:一个基于摄像头的简单计数工具。Demo阶段用Python+OpenCV,几行代码跑得飞快,准确率也好看。可一旦要打包成
    的头像 发表于 12-02 09:40 493次阅读
    那些<b class='flag-5'>年</b><b class='flag-5'>我</b>用OpenCV+Qt趟过哪些坑?写给视觉应用开发者的避坑指南

    国产芯片真的 “稳” 了?这家企业的 14nm 制程,已经悄悄渗透到这些行业…

    在 98% 以上,基本追平国际主流水平。而且他们开放了 “定制化芯片设计服务”,中小厂商不用再依赖进口,成本直接砍了 30%。 有人说 “先进制程才是王道”,但实际应用里,14nm 才是 “性价比王者” 啊!你们觉得国产芯片现
    发表于 11-25 21:03

    觉得哪个软件verilog体验最好?有什么优势?

    觉得哪个软件verilog体验最好?有什么优势?请在评论区留言跟大家分享一下吧。
    发表于 11-10 07:47

    HarmonyOSAI编程编辑区代码

    利用AI大模型分析并理解开发者在代码编辑区的上下文信息或自然语言描述信息,智能生成符合上下文的ArkTS或C++代码片段。 使用约束 建议在编辑区内已有较丰富上下文,能够使模型对编程场景有一定
    发表于 08-21 15:43

    入行嵌入式应该怎么准备?

    知识: 一、C/C++编程C/C++是嵌入式系统开发中最常用的编程语言。熟练掌握C/C++语言将使你能够理解和编写底层驱动程序、操作系统以及与硬件交互的代码。对于嵌入式系统来说,效率和资源利用率
    发表于 08-06 10:34

    FLASH烧/编程白皮书

    白皮书:如何烧Flash——不同场景不同需求下的选择认识Flash NAND vs. NOR如何烧/编程不同方案比较
    发表于 07-28 16:05 0次下载

    Ansible代码上线项目实战案例

    在DevOps浪潮中,自动化部署已经成为每个运维工程师的必备技能。今天将分享一个完整的Ansible代码上线项目实战案例,让你的部署效率提升10倍!
    的头像 发表于 07-24 14:03 740次阅读