|
| 1 | ++++ |
| 2 | +title = "编程十年的感悟" |
| 3 | +date = 2024-12-15T21:09:00-08:00 |
| 4 | +lastmod = 2024-12-22T18:05:36-08:00 |
| 5 | +tags = ["summary", "life", "programming"] |
| 6 | +categories = ["summary", "life", "programming"] |
| 7 | +draft = false |
| 8 | +toc = true |
| 9 | ++++ |
| 10 | + |
| 11 | +## <span class="section-num">1</span> 前言 {#前言} |
| 12 | + |
| 13 | +马尔科姆·格拉德威尔的“一万小时定律”指出,持续投入一万小时的努力,足以使人在某个领域达到专家水平。 |
| 14 | +按照每周20小时的练习量计算,每天大约需要投入3小时,十年左右才能达成这一目标。 |
| 15 | + |
| 16 | +从我写下第一行C代码算起,至今已超过十年。 |
| 17 | +期间,我编写了超过三十万行代码,其中一部分在微信编写的代码,曾服务过超过一亿的用户。 |
| 18 | + |
| 19 | +尽管写了这么多代码,我仍不敢自诩为专家。 |
| 20 | +但多年的“打工”生涯,日复一日地敲代码,也让我积累了不少感悟。 |
| 21 | +“工多艺熟”,这些感悟既是对编程技术的思考,更是对职场人生的体味。 |
| 22 | +毕竟,除了最初在学校学习的几年,我的编程生涯几乎都伴随着“打工”的酸甜苦辣(多是苦辣)。 |
| 23 | + |
| 24 | + |
| 25 | +## <span class="section-num">2</span> 持续学习 {#持续学习} |
| 26 | + |
| 27 | +虽然大学是从C语言入门编程的,但是我在大学时主修的语言是Java |
| 28 | +,毕竟Java是门非常成熟的工业语言,有非常丰富的框架,在国内的企业非常受欢迎,工作岗位也多。 |
| 29 | + |
| 30 | +我当时从Java Servlets入门Web开发,再学习了非常流行的JavaEE 企业开发框架SSH, 即 [Structs2](https://struts.apache.org/) [^fn:1]+ [Spring](https://spring.io/projects/spring-framework) [^fn:2]+ [Hibernate](https://hibernate.org/) [^fn:3], Struct2 负责控制逻辑关系,Spring 负责解耦, Hibernate 负责操作数据库. |
| 31 | + |
| 32 | +而到我开始找工作时,SSH的概念就变了, Struct2 被[SpringMVC](https://docs.spring.io/spring-framework/reference/web/webmvc.html) [^fn:4]所取代, SSH 变成了 SpringMVC + Spring + Hibernate. |
| 33 | + |
| 34 | +到我实习入职蚂蚁金服的时候,发现组里代码库操作数据库的ORM框架用的并不是Hibernate,而是 [Ibatis](https://ibatis.apache.org/) [^fn:5], 后面又切换成了新的 [MyBatis](https://mybatis.org/mybatis-3/) [^fn:6] |
| 35 | + |
| 36 | +而蚂蚁金服内部使用的也并不是Spring/SpringMVC, 而是自主研发出发的 [Sofa框架](https://github.com/sofastack/sofa-rpc) [^fn:7], Spring 社区后来觉得Spring框架过于重量级,不利于快速开发,又开发了更轻量级的 [SpringBoot ](https://spring.io/projects/spring-boot)[^fn:8], 而蚂蚁内部又推出了Sofa版本的 [Sofaboot](https://github.com/sofastack/sofa-boot) [^fn:9] |
| 37 | + |
| 38 | +去了微信支付后,前期都是在写C++, 使用微信内部自研的svrkit 框架,到后期因为负责数据治理相关项目的缘故,开始使用 Spark + Python + Hive SQL |
| 39 | + |
| 40 | +现在在AWS S3, 因为业务对性能和资源使用有非常高的要求,又开始使用Rust, 而历史业务又是使用Java, 兜兜转转之后,又回到Java的路子上。 |
| 41 | + |
| 42 | +细数下来, 这些年来,我写过Java,C++,Python,Rust,Javascript/Typescript 这些语言的生产代码. |
| 43 | + |
| 44 | +除去工作之外, 我还因为学习SICP 学习了Scheme, 因为使用Emacs 而学习了Emacs Lisp, 想做独立开发赚钱学习了Swift, 想感受Ruby on Rails的魅力而学习的Ruby, 还有以前为了压测写的Golang, 还有各种语言对应的框架和库. |
| 45 | + |
| 46 | +自我学习编程以来,学过的编程语言没有10种也有半打了. |
| 47 | + |
| 48 | +我也从来不会把自己定义为某门语言的程序员,如Java程序员,C++程序员等等, 我只叫自己做Software Development Engineer. 语言从来只是工具,只要你持续学习,遇到新的场景,自然就会学习新的编程语言了. |
| 49 | + |
| 50 | +计算机的世界日新月异,可能几个月就会出个新框架,几年又会流行一门新语言,只有持续学习,才能持续保持自己的竞争力。 |
| 51 | + |
| 52 | + |
| 53 | +## <span class="section-num">3</span> 学好英语 {#学好英语} |
| 54 | + |
| 55 | +领袖常说,「东升西降」,虽然不知道此种变化何时才能实现,但起码说明,目前是「西尚在上,东尚在下」,在计算机领域,尤其如此。 |
| 56 | + |
| 57 | +最前沿的技术都是英文资料,英语又是世界通行的语言,来自不同国家的开发者又会不约而同地使用英语来交流, |
| 58 | +因此学好英语既可以了解最新的技术潮流,又可以融入社区,建立自己的影响力。 |
| 59 | + |
| 60 | +疫情之后,越来越多的公司都开始推行远程办公,从全世界招聘开发者. |
| 61 | +这就意味着如果你英文过硬,甚至可以离开一线城市,避免高额的生活开销,在老家工作,陪伴在父母身边,同时赚取外汇;这对于饱受996困扰的程序员来说,未尝不是一条出路. |
| 62 | + |
| 63 | +于我个人而言,坚持学习英语可能是我收获最大的投资之一。 |
| 64 | + |
| 65 | +熟悉我的朋友,尤其是我的高中同学可能知道,十年以前,我的英文可以说着实挺烂的: |
| 66 | +满分150分的英语,只考个及格的90分可谓是家常便饭,后来也只会笨学英语,到高三的时候能考个120分已经是巅峰水平。 |
| 67 | + |
| 68 | +但上大学之后,我也没有就此懈怠放下英语,大一还每天去晨读英语。 |
| 69 | + |
| 70 | +没有口语交流的条件,就自己创造,去网上找人聊天, 当时还在一个叫 [Interpals](https://www.interpals.net/) [^fn:10] 聊天网站认识了全世界好多的人, 其中还有一个是年龄相仿的土耳其女孩,我们还加了Facebook, 经常用Skype 视频聊天. |
| 71 | + |
| 72 | +大学毕业后就没有那么多的时间闲聊后就断了联系, 最近看Facebook的动态,看她也穿上婚纱了. |
| 73 | + |
| 74 | +工作后也一直阅读英文的技术文章,用英文搜索内容,在Stackoverflow 和 GitHub 用英文回答问题,在Discord 的英语学习频道找人聊天, 把电脑和手机系统语言都换成英文的,从学习英语变成用英语。 |
| 75 | + |
| 76 | +人们常说,路应该要越走越宽,而不是越走越窄; |
| 77 | + |
| 78 | +而在我看来,英语就是夜里走路时手上拿着的手电筒,可以让我们走自己的路的同时, |
| 79 | +扫一下旁边那条道的情况,需要时及时转向,不至于一条路走到黑. |
| 80 | + |
| 81 | + |
| 82 | +## <span class="section-num">4</span> 独立思考 {#独立思考} |
| 83 | + |
| 84 | +微信以前一直有发最新Iphone手机的传统,但是那已经是4年前的美好时光了。 |
| 85 | + |
| 86 | +记得2021年是小龙明确年会不会发手机的第一年,他当时透露,那一年会发个铝片。 |
| 87 | + |
| 88 | +当时同事之间还在讨论,Iphone也是一块铝片冲压而成的嘛,那发的是否还是Iphone呢,不发手机只是烟雾弹? |
| 89 | + |
| 90 | +拆开年会礼物之后发现,的确是一块铝片,上面写着「2022保持独立思考」. |
| 91 | + |
| 92 | +{{< figure src="/ox-hugo/think_independently.jpg" >}} |
| 93 | + |
| 94 | +小龙一直强调「独立思考」对微信的重要性,认为如果要选择一个最重要的品质,他会选择「独立思考」。 |
| 95 | + |
| 96 | +上级说的不一定是对的,老师说的不一定是对,学术机构说的也不一定是对,媒体说的也不一定是对,声音大的更不一定是对,毕竟有理不在言高。 |
| 97 | + |
| 98 | +比如微服务架构非常流行,许多公司都在搞微服务,那么单体架构是否就应该不使用? |
| 99 | + |
| 100 | +作为初创公司或小团队,新业务是否要上微服务架构呢?还是先使用单体架构,业务发展起来再迁移到服务呢? |
| 101 | + |
| 102 | +开发过程免不了要做各种决策,比如技术选型,针对你的需求,你可能会找到一打「看似」符合要求的组件, |
| 103 | +可能还会去网上找找对各个组件的评价,会发现众说纷纭,就需要自己独立对每个组件做出分析,找出其优劣,再结合自身团队的特点,做出决策. |
| 104 | + |
| 105 | +关于独立思考,我最喜欢的是一句话是HBO出品短剧《切尔诺贝利》里面, |
| 106 | +科学家瓦列里·列加索夫希望克格勃释放调查真相同事乌拉娜·霍缪克的要求,说可以保证她是没问题的,克格勃头子回答的那句话: |
| 107 | + |
| 108 | +> Trust, but verify.(相信,但要核实) |
| 109 | +
|
| 110 | + |
| 111 | +## <span class="section-num">5</span> 先跑起来再说 {#先跑起来再说} |
| 112 | + |
| 113 | +这句话还有一个广为人知的变种:「又不是不能用」 |
| 114 | + |
| 115 | +很多的程序员都是完美主义者,尤其是读过《重构》和《设计模式》的程序员,会倾向于把很多时间来优化代码,做重构。 |
| 116 | + |
| 117 | +以前的我也会有类似的冲动,总会想时间去优化代码, 但是项目肝多了之后,有种强烈的感觉,还是先把MVP上线,及早让用户体验。 |
| 118 | + |
| 119 | +如果没有用户使用,再好再漂亮的代码也没有任何意义了。 |
| 120 | + |
| 121 | +所以经常看到社区有人问做副业的时候,应该用什么语言和框架,PHP/Python/Ruby 会不会太慢,我的观点一直都是,先做个原型跑起来,先找到第一个用户再说。 |
| 122 | + |
| 123 | +当运行速度成为瓶颈时, 你的业务已经非常大,肯定有足够的钱可以招一打的程序员把你的项目换成Golang/Java了。 |
| 124 | + |
| 125 | +对此,我很赞同坐我旁边大佬关于代码质量的说法: |
| 126 | + |
| 127 | +> make it run, make it fast, make it beautiful. |
| 128 | +
|
| 129 | +最近在做副业的尝试,有个深刻的体会,技术可能是商业里面最不重要的。 |
| 130 | + |
| 131 | +从零把产品做出来,推广给用户,用户只会关注你的产品是否好用,能否解决他们的问题. |
| 132 | + |
| 133 | +他们既不会关注你是用C++/Java还是Javascript 写的,也不会关注你代码写得是否优雅,与其执着于技术选型,不如先把产品干出来让用户试用。 |
| 134 | + |
| 135 | + |
| 136 | +## <span class="section-num">6</span> 顺手的才是最好的 {#顺手的才是最好的} |
| 137 | + |
| 138 | +经常会看到有人在社区提问,什么语言最好,什么框架最好,什么编辑器最好,什么操作系统最好。 |
| 139 | + |
| 140 | +「最好」是个相当主观的结论,也并没有针对所有场景的「最好」的解决方案, 但是经常能看到社区有人因为哪个语言更好而吵起来. |
| 141 | + |
| 142 | +或者有人在分享A的时候,有人会在下面回复B/C/D更好, 然后又争吵起来. |
| 143 | + |
| 144 | +让不禁让我想起《社会性动物》这本著名的社会心理学著作里面提到的团队认同现象, |
| 145 | +当球迷与某支球队产生强烈的认同感后,会将球队视为自我认同的一部分,这里他们会: |
| 146 | + |
| 147 | +1. 用「我们」而不是「他们」来称呼球队 |
| 148 | +2. 将球队的成功视为个人的成功 |
| 149 | +3. 对批评球队的言论产生防御性反应,将这些批评视为对自我的攻击 |
| 150 | + |
| 151 | +如果有人问我这个问题,我会回答「你顺手熟悉的工具的最好」。 |
| 152 | + |
| 153 | +即使是出于乐趣,编程的目的还是利用计算机解决问题,而解决问题最好的工具就是你最熟悉的工具。 |
| 154 | + |
| 155 | +除非你了解的工具不适用于你的问题,那么自然就需要一个新工具,也不要削足适履,矫枉过正。 |
| 156 | + |
| 157 | +当然,如果是为了满足求知欲而想去学习一个新的语言,那选择你感兴趣的就可以了。 |
| 158 | + |
| 159 | +当初在2017年学习Rust, 也只是因为大四没有课,时间充裕, 想学点有趣的新东西,那时候Rust1.0才发布2年, 可没指望能靠Rust找到工作 |
| 160 | + |
| 161 | +记不清在哪里看过的一段话: |
| 162 | + |
| 163 | +> 我也曾问过自己类似的问题: |
| 164 | +> |
| 165 | +> 1. 是不是好的东西就能流行?不一定 |
| 166 | +> 2. 是不是我喜欢的东西就是好的东西?不一定 |
| 167 | +> 3. 我会不会花时间精力在一个不一定会流行但是我喜欢的东西上?会 |
| 168 | +
|
| 169 | + |
| 170 | +## <span class="section-num">7</span> 多与人交流 {#多与人交流} |
| 171 | + |
| 172 | +程序员固然是和机器打交道,但是本质解决的还是人的问题. |
| 173 | + |
| 174 | +当初学习编程的时候,曾经有个误区,认为自己只要把技术搞好,就可以不去关心什么「人情世故」。 |
| 175 | + |
| 176 | +因此初入职场之后,我既是这么持有这样的想法,又是这样行动的,虽然不至于对其他人冷脸相对,但是难免会如好友形容那般:「孤傲」 |
| 177 | + |
| 178 | +但是被毒打时间久了才会发现,无论是在国内或国外,都难免会有「人情世故」,用英文来说,那叫 network and connection. |
| 179 | + |
| 180 | +即使我技术能力过硬,也需要被人见到才行,和同事领导相处关系好,才可以在做出成绩的时候,「花花轿子被众人抬」。 |
| 181 | + |
| 182 | +所以我现在都是有事没事都和同事们聊天,既可以提升下熟悉度,也可以了解到许多部门八卦, |
| 183 | +还可以从同事们抱怨中找到潜在优化点,践行自己「Work hard and be nice to people」的理念. |
| 184 | + |
| 185 | +这行做久了,会发现软件工程其实说到底,就是人的系统工程。 |
| 186 | + |
| 187 | + |
| 188 | +## <span class="section-num">8</span> 代码不是万能的 {#代码不是万能的} |
| 189 | + |
| 190 | +程序写多了之后就会有种幻觉,就是觉得什么事情都可以用代码来解决。 |
| 191 | + |
| 192 | +手里拿着锤子的时候,把什么都当成钉子来砸。 |
| 193 | + |
| 194 | +被毒打多才认清的事实就是,有很多事情是无法用代码来解决,代码只是个工具,只能在个合适的场景使用, 避免路径依赖. |
| 195 | + |
| 196 | +酒香也怕巷子深,只会写代码没啥用,还要写文章,在公司内部做分享,让别人能「看到你」。 |
| 197 | + |
| 198 | +编程肝项目的专业能力固然重要,但是也要有营销自己的软实力,就像一位长者说的那样: 两手抓,两手都要硬. |
| 199 | + |
| 200 | +不知道是中国人讲究谦虚内敛的品质,还是程序员「木讷呆板」的刻板印象,导致大家都不怎么营销自己。 |
| 201 | + |
| 202 | +有事没事和老板聊下天,增进下交流,经常露个脸,可能比肝十个项目还有用。 |
| 203 | + |
| 204 | + |
| 205 | +## <span class="section-num">9</span> 与优秀的人共事 {#与优秀的人共事} |
| 206 | + |
| 207 | +从业多年,去过蚂蚁金服,微信支付和AWS 搬砖, 和各种各样的同事都共事过,有个越发强烈的感悟: |
| 208 | + |
| 209 | +****要与优秀的人共事**** |
| 210 | + |
| 211 | +不仅能从他们身上学到非常到的优点,提升技术能力,可以学到最佳实践和工程经验,在Code Review 的时候可以学到更好的编程方式,遇到问题时又有靠谱的队友帮忙和指导。 |
| 212 | + |
| 213 | +由优秀的程序员开发出来的系统的独特之处,知道什么叫简单好用的系统,形成自己的技术品味。 |
| 214 | + |
| 215 | +品味与美感这个词是很抽象,但是用过了好用的系统,自然就不会对那些粗制滥造,还靠老板背书强行推广的系统感兴趣。 |
| 216 | + |
| 217 | +和优秀的同事共事的另外一个好处是可以建立高质量的人脉网络,利于职业发展,跳槽换赛道也多个选择。 |
| 218 | + |
| 219 | +虽然初始公司也有优秀的开发者,但是平均而言,大公司优秀程序员的比例会更高,毕竟他们更有竞争力的薪资福利,自然也有更高的招聘门槛。 |
| 220 | + |
| 221 | +比如微信就有所谓的面试委员会,除了招聘部门的面试官之外,还要通过面委面试官的考核,避免为了快速招人而降低标准。 |
| 222 | + |
| 223 | +所以个人建议应届毕业生,有机会还是去大公司,见识下。 |
| 224 | + |
| 225 | +虽然离职微信快两年了,我仍然想念当初同组共事的同事们,他们真的是技术过硬,人又超nice, 还乐于帮忙. |
| 226 | + |
| 227 | + |
| 228 | +## <span class="section-num">10</span> 身体是一切的本钱 {#身体是一切的本钱} |
| 229 | + |
| 230 | +编程这么多年,落下一堆的职业病。 |
| 231 | + |
| 232 | +大学时候就有的鼠标手(腱鞘炎), 工作几年之后「喜提」腰椎间盘突出,久坐下半身会麻痹,还有我曾经浓密黝黑的头发,现在也日渐凋零。 |
| 233 | + |
| 234 | +因为腾讯总部有免费的健身房,所以我基本工作日都会去健身房薅公司羊毛,2天有氧慢跑,2天无氧器械,坚持了快3年。 |
| 235 | +也开始注意自己的饮食,尽量少油少糖不喝酒。 |
| 236 | + |
| 237 | +健身虽然不是包治百病,但是起码人显得有精神了,也有精力应付高强度的工作了。 |
| 238 | + |
| 239 | +只有失去才会懂得珍惜,也真的只有在开始吃药,去医院复诊,才会开始注意身体。 |
| 240 | + |
| 241 | +虽然编程很有趣,虽然养家很重要,但是还是要注意身体,毕竟身体是一切的本钱,垮就没有其他的精彩故事了。 |
| 242 | + |
| 243 | + |
| 244 | +## <span class="section-num">11</span> 总结 {#总结} |
| 245 | + |
| 246 | +无论是编程,还是其他的技能,我感觉都是「马太效应」,你学得越多,你懂得越多,再学新的东西,你就会学得越快。 |
| 247 | + |
| 248 | +代码写多了才意识到,程序员的竞争力并不是写代码,也并不是哪门语言或者框架, |
| 249 | +其核心竞争力是通过技术解决问题的能力,又何必再去拘泥于哪门具体的编程语言或技术呢。 |
| 250 | + |
| 251 | +希望编程十年只是个起点,十年后可以再写一篇「编程二十年的感悟」 |
| 252 | + |
| 253 | +[^fn:1]: <https://struts.apache.org/> |
| 254 | +[^fn:2]: <https://spring.io/projects/spring-framework> |
| 255 | +[^fn:3]: <https://hibernate.org/> |
| 256 | +[^fn:4]: <https://docs.spring.io/spring-framework/reference/web/webmvc.html> |
| 257 | +[^fn:5]: <https://ibatis.apache.org/> |
| 258 | +[^fn:6]: <https://mybatis.org/mybatis-3/> |
| 259 | +[^fn:7]: <https://github.com/sofastack/sofa-rpc> |
| 260 | +[^fn:8]: <https://spring.io/projects/spring-boot> |
| 261 | +[^fn:9]: <https://github.com/sofastack/sofa-boot> |
| 262 | +[^fn:10]: <https://www.interpals.net/> |
0 commit comments