工作
快来分享你的内容吧~
- 07-04 09:35·全栈开发嗨~各位。7月初终于忙完毕业的事情,大学生涯终于结束了。我特别讨厌我的学校,从我退伍以来,就面临学籍学分的问题,4年来一直忙碌于各个学校政务部门之间,让我见识到了真正的官僚主义,以及学校对于退伍军人学业制度的不完善,并且夹杂着实习找工作等问题,这让我对山东这所城市有了一些厌恶,讨厌他们的文化和作风,不过这也是我个人所见,并不代表全部。我的大学可以说是炼狱一般,不过总算熬过来了。 现如今在一家创业公查看全文编程导航_小y:恭喜 Andy 上岸,也算是一个新的开始,接下来可以探索你说得自媒体方向,最好是分享 AI 编程相关的内容,后续可以写到简历提高竞争力。在这家公司工作 1-2 年就可以跳槽渠道更大的平台,加油~962分享
- 2025-11-02·Java后端
- 2025-01-15·Java后端
2025-01-08·后端无论是校园学习还是职场工作,你以为跟别人比拼靠的就是天赋和努力,其实比的还有方法和心态。查看全文大铃铛Weslie:忙的时候,把时间留给更重要的事情;不忙的时候,选择就变成了一种惬意~☺️42843分享
# 求职 想找河北邯郸或者邯郸周围6.5k+的工作,或者北京9k+的 求大佬们推荐 本人26应届
毕业第一站--杭州
嗨~各位。7月初终于忙完毕业的事情,大学生涯终于结束了。我特别讨厌我的学校,从我退伍以来,就面临学籍学分的问题,4年来一直忙碌于各个学校政务部门之间,让我见识到了真正的官僚主义,以及学校对于退伍军人学业制度的不完善,并且夹杂着实习找工作等问题,这让我对山东这所城市有了一些厌恶,讨厌他们的文化和作风,不过这也是**我个人所见,并不代表全部**。我的大学可以说是炼狱一般,不过总算熬过来了。 现如今在一家创业公司,干着全栈,业务方向是医疗,薪资也符合我的最初的期望,但是有半年的试用期。不过我已经很知足了,后续也是慢慢调理身体,多多运动,然后在杭州慢慢发展。 技术栈也是从java扩充到了vue,并且还要帮助公司搭建harness框架,创业公司,有什么要求我都可以接受,反正开学就完事了。我就算加班,也比在学校活得轻松,出租房里还能有自己的空间。 副业方面,最近一直想着做自媒体,开个工作室接接单什么的,反正周末就开始瞎忙活,有一些鱼友也在b站上找到了我,非常开心,也是在尝试一些新方向,折腾折腾,未来怎么样,没想过,先这样吧。 
被美团项目给生煎了
### 接了一个项目 项目非常简单:写一个日调用量10W - 100W的接口,并解决性能问题。 其中,有的接口有一个列表,3W个参数。 当然,qps几十毫秒就行,最差300ms。 ### 3W个参数? 有人说:什么神经接口,3W个参数?你扯淡呢。这个接口不合理啊。 不合理又能怎么办呢?业务就是这样的。 我就开发了一个接口,然后:被打回了。 ### 命名不规范 为了保密,就用其他方式代替。 公司有个业务,需要买20斤牛肉。 于是,我就起了一个函数名:buyBeef。 然后,主R表示,你命名的不规范,应该是buy牛Meat。 ``` beef,英语单词,名词、动词,作名词时译为“牛肉;肌肉;食用牛;牢骚”,作动词时译为“抱怨,告发;发牢骚;养;加强” ``` beef是俚语,他不规范。他有两个意思:矛盾、牛肉,万一有人理解为了“买矛盾”就有歧义。 **你看之前的函数名,买羊肉是Buy羊Meat, 买猪肉是Buy猪Meat,你起了一个函数名BuyBeef,不伦不类,有业务歧义!!!** 胳膊拧不过大腿。 于是,我把写好的代码给重构了,改了几十个地方的函数名。 宝宝委屈,但是我不说。 ### 二次重构 然后,就是有的接口有几万个参数。 有人说:加缓存! 你查询缓存几万次也慢啊。解决不了。 如何解决?前端后端一起,通过业务进行汇总。 啥意思呢?大家深挖业务语义,通过不同场景对数据进行分类,最后汇总出有效业务逻辑,实现性能提升。 人话:**技术解决不了,基于业务来解** 问题是:我进美团才多久,我对业务有多深的了解,你指望我通过业务来解,你直接杀了我得了。 ### 业务两眼一抹黑 有人说:问啊。怎么问? 汇总了一下,有4个场景。 然后,主R表示,有5个场景,你还漏了1个。 去写if else分支就行了,基于这5个场景,写5套解决方案。 其中1、2是有XX参数的,基于XX参数给我解掉。3的话,可以尝试传XX参数进行解决,4通过传XX参数可以解,5解不了。 写。 哈????????????????????????????????????? ### 哈??44 于是,折腾了整整1天,写了20行代码。 代码一点都不复杂,但是问题是:这是代码量的问题嘛,谁知道这个业务逻辑??? 真是让主R手把手的讲业务,讲完以后一行一行凑出来的。 ### 和前端沟通 下一个问题更严重了:**后端单独解不了,需要前端的协助。但是前端也不太懂业务逻辑。** 他传错参数3次!!! 比如说,他把用户ID当成账号ID传进来了。 你要是问我,什么叫用户ID,什么叫账号ID,明明是一回事,我也难以用一句话来给你沟通,只能告诉前端:他们两个不一样,至于怎么不一样,我去问主R。 前端已经心态炸了:我没有这个参数。 于是我循循善诱:那么请问XX这个字段有没有?他:有的。 我:那就传这个参数,可以嘛?? **你让我基于业务去解技术问题,我有个屁的业务经验** ### 延期 于是,非常痛苦的延期。 **谁XX通过业务来解技术问题啊**
聊聊“副业”
有的活,穷死都不能干。 ### 性价比 在济南,有一些大妈在医院当护工,工资是2500. 在北京,有一些人当保姆,工资是20K一个月。 我不否认说保姆的水平可能比护工强一些,但是真的差10倍嘛? 差距在哪里? * 一个月2W请保姆的是什么家庭?是月入过2W的家庭 * 请2500护工的是什么家庭,是工资2500的家庭 没有什么深刻的逻辑,就是“**甲方没钱,乙方乐意低工资**”。 * 农村一大群没有工作的老头老太太,有一份2500的工作就很开心,没有那么多需要照顾的病人 * 在一线城市,有很多需要照顾的老头老太太,但是缺乏能够照顾他们起居的保姆 供需逆转,差价能差10倍。 ### 价格 写代码这个事情,是个“非常主观量化”的价格。 * 在大厂,可能有个人哼哧哼哧一个月2000行,拿着几十万的工资 * 在小厂,哼哧哼哧干了几万行,拿着七八千的工资 * 在大学,写了几千行代码,拿到了几百块钱 我上学的时候,见过很见鬼的事情: * 一个小实验,带源代码,能跑通,50 * 毕业设计,几百给你搞定 问题是:清澈的大学生还嫌贵。 你说这种地方,怎么出高价单??? ### 只干能赚钱的单 活下来的公司都有这个本事。 * 因为人力是招聘的,房子是租的 * 不接单子,没钱发工资,倒闭 * 接了单子,赚不到钱也倒闭 * 能活下来的公司,他不仅能接到单子,而且能赚到钱 大部分的人是**有需求、但是没有钱,抱怨为什么开发公司不愿意倒贴给他干,所以挂在网上的** ### 如何发现高价单? 高价单就跟石头里面开翡翠、彩票中了5000W。能开出几个就不错了。
不是哥们,26 岁程序员,去种头发了?
大家好,我是程序员鱼皮。 没让关注我的朋友失望,哥们成功脱发了,开始想方设法搞头发了! 又多一段神奇的经历,关注鱼皮,品味程序员的百味人生。 <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/2OvQcwLt3e6xY6XE.webp" alt="" width="224px" /></p> 其实早在我上大学那会儿就开始脱发了,只不过当时学业繁忙,再加上剩余发量还能盖的住头皮,就没太在意。 最开始还是我室友发现的,有一天我正在打游戏,正在笑着玩,我室友从我身后经过突然大叫一声:“我曹,你头发呢?” <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/Y969TVGGEd9WbEwE.webp" alt="" width="330px" /></p> 我这才意识到不对劲,原来哥们真的聪明绝顶?! 当时随便去医院看了看,医生也随便给我看了看,就确诊了 “脂溢性皮炎” + “雄性激素脱发”,给我开了点非那雄胺片和二硫化硒洗剂,让我回去用。 那会儿我还从网上了解到米诺地尔酊能生发,于是也搞了一瓶。但是后面因为实习工作忙的原因,没坚持下来,结果脱发更快了,真丶发如雨下。 <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/98xrbN4xmuGRDVn1.webp" alt="" width="382px" /></p> 这里解释下为什么脱发更快了?因为据说米诺地尔酊这玩意是有狂脱期的,也就是先把辣鸡头发脱掉,再生新的。结果我应该是刚坚持到狂脱期,就停用了。。。真特么卡点大师! 我的第一段生发之旅到此稀巴烂地结束。工作也这么多年了,我无时无刻不活在脱发的焦虑之中,做一个项目掉一撮头发。我也曾在无数个日夜中想到我脱掉的头发:大毛、二毛、三毛,你们在哪里?你们现在过得还好么?记得常回家看看啊! <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/MIwtP4puzISyetTD.webp" alt="" width="154px" /></p> 有同学好奇:看照片没觉得你脱发啊?你是怎么保证头发这么茂密的? 我说:我特么硬装呢!刘海留这么长就是为了盖头皮啊! <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/u9g2hOMiaMTuGFb7.webp" alt="" width="230px" /></p> 但现在的问题是,我的刘海有点盖不住头皮了。。。脱发君给我来了个前后夹击,这都快夏天了,头顶还是凉飕飕的呢~ 于是我到网上咨询怎么生发和植发,刚进小众点评,系统就给我弹了个植发避坑指南。你别说,还挺贴心: <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/yNmaLgdfAAYIco19.webp" alt="" width="100%" /></p> 看了下避坑指南,我觉得还是不能贸然植发,先去上海的三甲医院看看吧。 这次我去的是上海长征医院,据说治脱发有一手的。果然这次的医生很专业,不是瞅一眼就下结论了,而是让我去做了一些检查。来来来,你们看看! <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/UnIqSF9iURs9nAcP.webp" alt="" width="100%" /></p> 当时我看到有一项真菌检查,瞬间燃起了希望!因为当年有位室友就是因为真菌疯狂脱发,除了真菌之后又长满了,有种春风吹又生的爽感。 很可惜,哥们不是真菌感染,就是单纯的脱发,外加有点脂溢性皮炎。看看下面这张图,可谓触目惊心啊!(写到这里的时候我都忍不住掉了一颗小珍珠) <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/5SoLY2kiLT9Z8nDC.webp" alt="" width="100%" /></p> 接下来就是治疗方案了,首先是药药药,内服外涂都有,除了单子上这些我还单独买了非那雄胺。。。 <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/ottHA9BjYJtOiBVD.webp" alt="" width="100%" /> 还有个新鲜的疗法,平均每周我要去医院照光 2 次,每次大概 20 分钟,价格还挺贵的,100 一次! <img src="https://pic.code-nav.cn/post_picture/1612112932991139842/cIq3e0cuC8nHnkaP.webp" alt="" width="100%" /> 所谓照光,就是把脑袋放到一个能散发红光的仪器下面晒着,还挺伤眼睛的,得专门带个墨镜。给你们开开眼界: <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/SiOC1A8n2fvlCaTv.webp" alt="" width="100%" /></p> 看到这里,我估计你们现在就是下面这个表情 —— 多新鲜呐! <p align="center"><img src="https://pic.code-nav.cn/post_picture/1608440217629360130/saVaZMcBtS0pRtuc.webp" alt="img" width="416px" /></p> 光有上面这些疗法效果还是不够的,医生说还有 2 种效果更好的方法:抽血移血治疗 + 微针治疗(2 选 1)。 微针我倒是听说过,往头发上种针嘛。但那个抽血移血治疗是什么? 医生解释说:从你胳膊抽血,然后把血打到你头皮上,一个月一次,3 次就会有效果 。 好家伙,还能这么操作?直接给我听愣了。虽然我一抽血就犯晕,但奈何 3 次就效果属实让我心动了啊,抽抽抽! 于是我按照医生的要求去药店买装血用的离心管,然后开始了手术,放一张图给你们看看: <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/TZSpUtP6diIekMjr.webp" alt="" width="100%" /></p> 是不是还挺刺激的? 不过实话说,往头上扎针注血的过程不疼,就是有种脑袋里进水的错觉。当时我满脑子都是:大毛二毛撑住啊,你们有救了啊! 哝,就是这个,价格还挺贵的,但也比植发便宜多了。 <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/SQ3HFsbYoevlRQbY.webp" alt="" width="100%" /></p> 不过效果好不好我就不知道了,大家等我的好消息吧。希望是好消息,不是好笑嘻。。。 哦对了,医生还说了,一定要在 23 点前睡觉! 每次听到这我只能苦笑 —— 难道我不想么?! <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/tTzMXtY2U1UXT9Z8.webp" alt="" width="212px" /></p> 不过不管接下来的治疗结果怎么样,起码我也收获了一波经验,能够分享给大家,也算是不忘初心吧(当然希望大家最好用不上)。 最后分享一份我从医院拿来的养发秘诀,共勉啊共勉! <p align="center"><img src="https://pic.code-nav.cn/post_picture/1612112932991139842/vrENuHCx44SDJw5d.webp" alt="img" width="100%" /></p> ## 更多 💻 编程学习交流:编程导航:https://www.codefather.cn/ 📃 简历快速制作:老鱼简历:https://laoyujianli.com ✏️ 面试刷题神器:面试鸭:https://mianshiya.com 📖 AI 知识库:https://ai.codefather.cn/
准备找新工作了,加油💪
聊一聊“加薪”
### 业务背景 大概在几年前的时候,浪潮。 * 项目经理不懂任何技术 * 某个项目很挣钱,前途不错,所以接了 * 技术骨干拒绝 然后项目经理和技术骨干吵起来了。 ### 是否自私 技术骨干在接项目之前评估过项目的难度。 * 负责一个项目5年了,干了十几年技术了,底子是有的 * 假如有80%的把握,那他肯定接 * 大概率成功率30%以下 然后: * 如果项目成立,那么技术骨干就是绝对的CTO(首席技术,或者叫架构师) * 项目黄了或者出了问题,技术骨干吃不了兜着走 * 项目技术难度完全不可控 项目成了加薪,不成滚。 技术骨干不敢接,大不了不加薪了。人家有家庭有房贷,为了30%成功率的项目搭进去? 最后:一个年轻人接了。 * 年轻人工作年限低,初生牛犊不怕虎 * 辞退了大不了找下家 ### 强推项目 我昨天聊了一下: * 一个非常紧急的线上事故 * 然后群友通过技术方案直接解决 * 升职加薪 搞问心一言的时候: * 所有人都不会chatgpt,但是强行接了 * 攻关组的加班费吃到满 * 项目成了 我是比较倒霉的一个家伙: * 先去小厂负责了一个成功率基本为0的项目 * 失败了被开除 * 我在华为被强推了一个成功率很低的项目 * 然后失败了被开除 相同的背景。但是看结果。 * 不成洗洗睡 * 成了涨工资 我觉得不如跳槽一根毛。
我坚持 4 年的省时间大法!
无论是校园学习还是职场工作,你以为跟别人比拼靠的就是天赋和努力,其实比的还有方法和心态。 就拿学习来说,有的人备战考研走一步看一步,时间很赶;有的人会提前规划好考研的时间安排,有序完成。这是比方法。 就拿工作来说,有的人拿到复杂的任务,就觉得自己完不成;有的人拿到复杂的任务,会设计各种方案来攻坚。这是比心态。 今天要分享的是我自己一直以来坚持的 15 个节省时间的方法,帮大家把学习和工作效率拉满,也能减少迷茫。 1)先完成确定的工作:没想好怎么办时,先做清楚的任务。比如我写文章没灵感时,就不会硬想,而是先去做别的,把控整体的工作进度。 2)制定清晰的任务清单:按照优先级整理自己的每日任务,一条条打 ✅ 完成,增加动力。 3)时间切片:将每天的时间分段,每段只专注完成一个小任务,减少连续高强度学习的压力。 4)分解复杂任务:把大任务分成小步骤,逐步攻克,尤其适合写论文、搞大项目和方案。当你觉得做一件事情很难时,就必须这么做。 5)学会适时放弃:拒绝一些不重要的任务,不要让一些小事干扰了你的节奏。 6)减少无效信息:限制刷手机的时间,工作时设置为免打扰。你是要干大事的人,怎么能沉迷于某音某手某书? 7)提前准备:提前准备好第二天的事情,减少开工阻力,适合假期结束的时候。 8)用过渡任务启动:当你不想工作的时候,可以先选择一个简单不费脑的任务开始,逐步进入状态。 9)学会复用:对程序员来说,这是基本功,但复用的难点在于沉淀,建议定期整理自己的工作成果,便于后续找到它并复用。 10)劳逸结合:休息是非常有必要的,学习工作一段时间后,去接杯水吧~ 11)利用碎片时间:如果你真的很忙,不妨利用通勤等零碎时间完成小任务,比如回复消息、读文章背单词等等。 12)批量处理任务:把相似任务集中处理,节省切换时间。我也是这么建议团队的运营和销售同学的,如果每分钟都盯着消息看,就没有连续的时间做其他工作了。 13)倒计时法:给任务强行添加一个时间限制,鼓励自己快速完成。看过我教程的同学应该知道,经典 “20 分钟” 嘛,就是这个作用。 14)简化决策:我们每天都会在日常琐事选择上浪费很多时间,比如外卖点什么、今天穿什么,可能我就比较随意,吃啥穿啥都行,把时间留给更重要的事情。不过如果不忙的话,选择何尝不是一种惬意? 15)定期反思优化:可以每周回顾一次时间管理,找出效率不高的原因,便于后续改进。我们每个人都有自己的黄金时间,也就是一天中你注意力最集中的时间,找到它很重要。(不过现在很多年轻人的黄金时间都是在半夜?) 以上 15 个方法,看看你用过哪些呢?还在迷茫的话,不妨就立刻挑一个小任务开始行动吧! ## 更多 💻 编程学习交流:[编程导航](https://www.codefather.cn/) 📃 简历快速制作:[老鱼简历](https://laoyujianli.com) ✏️ 面试刷题神器:[面试鸭](https://mianshiya.com)
<<10x程序员工作法>>40 | 我们应该如何保持竞争力?
在前面两讲,我结合着两个程序员要直接面对的场景,讨论了如何综合运用前面学习到的知识,这一讲的内容可能不涉及到实际的应用场景,但与每个人的发展息息相关。我想谈谈如何走好程序员这条路。 ### 焦虑的程序员 让我们再次用思考框架分析一下问题。首先,现状是什么?关于这个问题,我并不打算讨论个体,因为每个人的情况千差万别,我准备从整体入手。 IT 行业是一个快速发展变化的行业,一方面,我们不断地看到有人快速取得成功,另一方面,我们也听到了许多充满焦虑的声音。获得大的成功总是一个小概率事件,大多数人面对的还是日常的柴米油盐。 **我们的焦虑来自于对未来的不确定性,而这种不确定性是一个特定时代加上特定行业的产物。** 如果把时间倒回到上个世纪 80 年代之前,虽然当时的生活条件一般,但很少有人会为未来的发展焦虑,因为那时候,人们可以清晰地看到自己未来的人生,尽管那种人生可能是平淡的。 但今天的我们处在一个人类历史上少有的快速发展时代,我们看不清以后的人生,大脑却还停留在上一代人的思维习惯上。 IT 行业在国内的大发展也就最近 20 多年的事,行业里很少有走过完整职业生涯的程序员。也正是因为如此,我们经常会产生了各种焦虑: * 我刚刚入行时,有人问,程序员能做到 30 岁吗? * 我快 30 岁时,有人问,35 岁还能做程序员吗? * 我 35 岁时,讨论变成了 40 岁的程序员该怎么办。 估计等国内有越来越多的程序员走完了整个职业生涯,就会有人关心,程序员退休之后的生活应该是什么样子了。 从长期来看,只要生活中还有需要用自动化解决的问题,程序员这个群体还是很有前景的。但随着时间的推移,程序员这个职业的溢价也会越来越低,单纯凭借身处这个行业就获得好发展的可能性也越来越低,想让自己的职业生涯走得更顺畅,还需要找到更好的目标,不断努力。 ### 成为 T 型人 我们再来回答下一个问题:目标是什么。也许这时候,每个人脑子里想到的职业发展路线都不一样,但我准备用一个统一的目标回答你:成为 T 型人。 **什么叫 T 型人?简言之,一专多能。** <img src="https://pic.code-nav.cn/post_picture/1688022738838552578/qFnkkTm8JxEynSsP.webp" alt="T形人才.png" width="100%" /> **有了“一专”,“多能”才是有意义的,否则,就是低水平重复,而这正是很多人职业生涯不见起色的真正原因。** 这里的“专”不是熟练,而是深入。你可能是个有着 10 年丰富经验的程序员,但实际上只不过是重复了 10 年解决同样难度的问题而已,这根本就不算深入,也就没有做到真正意义上的“一专”。 你会发现很多优秀的人,在很多方面都会很优秀,这是“一专”带来的触类旁通。 当你有了“一专”,拓展“多能”,就会拥有更宽广的职业道路。比如,我拥有了深厚的技术功底,通晓怎么做软件: * 如果还能够带着其他人一起做好,就成了技术领导者。 * 如果能够分享技术的理解,就有机会成为培训师。 * 如果能够在实战中帮助别人解决问题,就可以成为咨询师。 反过来,当你有了“多能”,也可以拓宽你的视野,帮你认清自己的“一专”怎样更好地发挥价值,而不是狭隘地认为自己有了技术,就已经天下尽在掌握了。视野窄,缺乏大局观,也成为了许多程序员再进一步的阻碍。事实上,这个专栏里的很多内容都是帮你打开“多能”的视角。 也许你会说,我在公司已经独挡一面了,应该算有“一专”了吧?但我想说的是,可能还不够。只做一个公司的专家,受一个公司的波动影响太大,而成为行业的专家,才会降低自己职业生涯的风险。 有时,我在面试时会问候选人这样一个问题:“如果让你在一次技术大会上做分享,你会讲什么呢?”我真正的问题是,以行业标准衡量,你觉得你在哪个方面是专家呢? 大多数人从来没有思考过这个问题,他们只是日常在完成自己的工作,即便在某一方面已经做得很不错了,但依然算不上专家,因为他们缺乏深度思考。 比如,你非常熟悉 Kafka,知道它的各种参数,也读过它的实现原理。但如果我问你,Kafka 为什么要把自己定位成一个分布式流平台,它要想成为一个流平台,还要在哪方面做得更好?你的答案是什么呢? 这其中的差别就是,前面所谓的熟悉,只是熟悉别人的思考结果,而后面则是一个没有现成答案的东西。学习微积分是有难度,但同发明微积分相比,难度根本不在一个层次上。当然,我不是说你要熟悉所有工具的发展过程,而是自己要在一个特定的方面拥有深度的思考。 也许你会说,这个要求实在是太高了吧!没错,这确实是一个很高的要求。但“取法于上,仅得为中;取法于中,故为其下。” 其实,很多人的焦虑就源自目标太低,找不到前进的动力。给自己定下一个可以长期努力的目标,走在职业的道路上才不致于很快丧失动力。 ### 在学习区成长 现在我们来回答第三个问题,怎么达到目标。既然要朝着行业中的专家方向努力,那你就得知道行业中的专家是什么样。我的一个建议是,向行业中的大师学习。你或许会说,我倒是想向大师学习,但哪有机会啊!好在 IT 行业中的许多人都是愿意分享的,我们可以读到很多大师级程序员分享的内容。 我在入行的时候,有幸读了很多经典之作,比如,出身贝尔实验室的很多大师级程序员的作品,诸如《C 程序设计语言》《程序设计实践》、《Unix 编程环境》等,还有一些像 EricRaymond 这样沉浸编程几十年的人写出的作品,诸如《Unix 编程艺术》,以及前面提及的 Kent Beck、Martin Fowler 和 Robert Martin 等这些人的作品。 读这些书的一个好处在于,你的视野会打开,不会把目标放在“用别人已经打造好的工具做一个特定的需求”,虽然这可能是你的必经之路,但那只是沿途的风景,而不是目标。 接下来,我们要踏上征程,怎么才能让自己的水平不断提高呢?我的答案是,找一个好问题去解决,解决了一个好的问题能够让你的水平快速得到提升。什么是好问题?就是比你当前能力略高一点的问题,比如: * 如果你还什么都不会,那有一份编程的工作就好。 * 如果你已经能够写好普通的代码,就应该尝试去编写程序库。 * 如果实现一个具体功能都没问题了,那就去做设计,让程序有更好的组织。 * 如果你已经能完成一个普通的系统设计,那就应该去设计业务量更大的系统。 为什么要选择比自己水平高一点的问题?这与我们学习成长的方式有关。Noel Tichy 提出了一个“学习区”模型,如下图所示: <img src="https://pic.code-nav.cn/post_picture/1688022738838552578/ctQ7G5TYFRfIvaN6.webp" alt="学习区.png" width="100%" /> 最内层是舒适区(Comfort Zone),置身其中会让人感觉良好,但也会因为没有挑战,成长甚微,你可以把它理解成做你最熟悉的事情。 最外层是恐慌区(Panic Zone),这是压力极大的地方,完全超出了你的能力范围,你在其中只会感到无比的焦虑。 中间的是学习区(Learning Zone),事情有难度,又刚好是你努力一下可以完成的,这才是成长最快的区域。 根据这个模型,只有一直身处学习区才能让人得到足够的成长,所以,我们应该既选择比自己能力高一点的问题去解决,不要总做自己习惯的事,没有挑战,也不要好大喜功,一下子把自己的热情全部打散。 在学习区成长,就不要满足于当前已经取得的成绩,那已经成为你的舒适区。因为我们有远大的目标在前面指引,完成日常的工作只不过是个人成长路上的台阶。 也许你会说,我的工作不能给我个人成长所需的机会,怎么办呢?实际上,别人只会关心你是否完成工作,成长是自己的事情,很多机会都要靠自己争取,前面提到的那些具体做法完全是你可以在工作范围内,自己努力的事情。 如果你当前的工作已经不能给你提供足够好的问题,那就去寻找一份更有挑战性的工作。在IT 行业,跳槽似乎是一件很常见的事,但很多人跳槽的时候,并不是以提升自己为目标的。造成的结果是,不断地做同一个层面的工作,自然也就很难提升自己的水平。 为什么程序员都愿意到大厂工作?因为那里有高水平的人和好的问题。但如果只是到大厂去做低水平的事,那就是浪费时间了。所以,即便你真的想到大厂工作,与谁一起工作,做什么事,远比进入大厂本身要重要得多。 如果你真的能够不断向前进步,迟早会遇到前面已经没有铺就好的道路,这时候,就轮到你创造一个工具给别人去使用了。比如,2012 年,我在项目中受困于集成问题,却找不到一个我想要的、能在单元测试框架里用的模拟服务器,于是,我写了 Moco。 最后,我还想鼓励你分享所得。我在《28 | 结构化:写文档也是一种学习方式》中和你说过,输出是一种将知识连接起来的方式,它会让人摆脱固步自封,也会帮你去创造自己的行业影响力,机会会随着你在行业中的影响力逐渐增多,有了行业影响力,你才有资格成为行业专家。 当你成为了一个行业级别的专家,就可以在这条路上一直走下去,而不必担心自己是不是拼得过年轻人了,因为你也在一直前进! ### 总结时刻 程序员是一个充满焦虑的群体,焦虑的本质是对未来的不确定。工作在这个时代的程序员是一个特殊的群体,一方面,这个大时代为我们创造了无数的机会,另一方面,因为程序员是一个新的行业,所以,很多人不知道未来是什么样子的,焦虑颇深。 从目前的发展来看,IT 行业依然是一个非常有前景的行业,但想在这条路上走好,需要我们成为 “T ”型人才,也就是“一专多能”。一专多能的前提是“一专”,让自己成为某个方面的专家。这个专家要放在行业的标准去看,这才能降低因为一个公司的波动而造成的影响。 成为行业专家,要向行业的大师学习,给自己定下一个高的目标,然后是脚踏实地,找适合自己的问题去解决,让自己一直在学习区成长。 如果今天的内容你只能记住一件事,那请记住:**在学习区工作和成长。**
<<10x程序员工作法>>39 | 面对遗留系统,你应该这样做
在上一讲中,结合着“新入职一家公司”的场景,我给你讲了如何在具体情况下应用我们前面学到的知识。这一讲,我们再来选择一个典型的实际工作场景,将所学综合应用起来。这个场景就是面对遗留系统。 在《34 | 你的代码是怎么变混乱的?》中,我给你讲了代码是会随着时间腐化的,无论是有意,还是无意。即便是最理想的场景,代码设计得很好,维护得也很精心,但随着技术的不断升级进步,系统也需要逐步升级换代。 比如,我们一直认为电信是一个独特的领域,与 IT 技术是完全独立的,学好CT(Communication Technology,通信技术)就可以高枕无忧了。但随着 IT 技术的不断发展,今天的电信领域也开始打破壁垒,拥抱 IT 技术,提出了 ICT 的概念(Information and Communications Technology,信息通信技术)。所以,无论怎样,系统不断升级改造是不可避免的事。问题是,你连自己三个月前写的代码都不愿意维护,那当面对庞杂的遗留系统时,你又该何去何从呢? 很多人的第一直觉是,我把系统重写一下就好了。不经思考的重写,就像买彩票一样,运气好才能写好,但大多数人没有这么好运气的,我们不能总指望买彩票中大奖改变生活。那有什么稍微靠谱的一点的路呢? ### 分清现象与根因 面对庞大的遗留系统,我们可以再次回到思考框架上寻找思路。 * Where are we?(我们现在在哪?) * Where are we going?(我们要到哪儿去?) * How can we get there?(我们如何到达那里?) 第一个问题,面对遗留系统,我们的现状是什么呢? 我在这个专栏前面的部分,基本上讨论的都是怎么回答目标和实现路径的问题。而对于“现状”,我们关心的比较少。因为大多数情况下,现状都是很明显的,但这一次不一样。也许你会说,有什么不一样,不就是遗留系统,烂代码,赶紧改吧。但请稍等! 请问,遗留系统和烂代码到底是不是问题呢?其实并不是,**它们只是现象,不是根因。** 在动手改动之前,我们需要先分析一下,找到问题的根因。比如,实现一个直觉上需要两天的需求,要做两周或更长时间,根因是代码耦合太严重,改动影响的地方太多;再比如,性能优化遇到瓶颈,怎么改延迟都降不下来,根因是架构设计有问题,等等。 所以,最好先让团队坐到一起,让大家一起来回答第一个问题,现状到底是什么样的。还记得我在《25 | 开发中的问题一再出现,应该怎么办?》中提到的复盘吗?这就是一种很好的手段,让团队共同确认现状是什么样子的,找到根因。 为什么一定要先做这个分析,直接重写不就好了?因为如果不进行根因分析,你很难确定问题到底出在哪,更关键的是,你无法判断重写是不是真的能解决问题。 如果是架构问题,你只进行模型的调整是解决不了问题的。同样,如果是模型不清楚,你再优化架构也是浪费时间。所以,我们必须要找到问题的根源,防止自己重新走上老路。 ### 确定方案 假定你和团队分析好了遗留系统存在问题的根因,顺利地回答了第一个问题。接下来,我们来回答第二个问题:目标是什么。对于遗留系统而言,这个问题反而是最好回答的:重写某些代码。 你可能会问,为什么不是重构而是重写呢?以我对大部分企业的了解,如果重构能够解决的问题,他们要么不把它当做问题,要么早就改好了,不会让它成为问题。所以我们的目标大概率而言,就是要重写某些代码。 但是,在继续讨论之前,我强烈建议你,**先尝试重构你的代码,尽可能在已有代码上做小步调整,不要走到大规模改造的路上,因为重构的成本是最低的。** 我们真正的关注点在于第三个问题:怎么做?我们需要将目标分解一下。 要重写一个模块,这时你需要思考,怎么才能保证我们重写的代码和原来的代码功能上是一致的。对于这个问题,唯一靠谱的答案是测试。对两个系统运行同样的测试,如果返回的结果是一样的,我们就认为它们的功能是一样的。 不管你之前对测试是什么看法,这个时候,你都会无比希望自己已经有了大量的测试。如果没,你最好是先给这个模块补测试。因为只有当你构建起测试防护网了,后续的修改才算是走在坚实的道路上。 说到遗留代码和测试,我推荐一本经典的书:Michael Feathers 的《修改代码的艺术》(Working Effectively with Legacy Code),从它的英文名中,你就不难发现,它就是一本关于遗留代码的书。如果你打算处理遗留代码,也建议你读读这本书。 在 2007 年,我就给这本书写了一篇书评,我将它评价为“这是一本关于如何编写测试的书”,它会教你如何给真实的代码写测试。 这本书对于遗留系统的定义在我脑中留下了深刻印象:遗留代码就是没有测试的代码。这个定义简直就是振聋发聩。按照这个标准,很多团队写出来的就是遗留代码,换言之,自己写代码就是在伤害自己。 有了测试防护网,下一个问题就是怎么去替换遗留系统,答案是分成小块,逐步替换。你看到了,这又是任务分解思想在发挥作用。 我在《36 | 为什么总有人觉得 5 万块钱可以做一个淘宝?》中提到,淘宝将系统改造成Java 系统的升级过程,就是将业务分成若干的小模块,每次只升级一个模块,老模块只维护,不增加新功能,新功能只在新模块开发,新老模块共用数据库。新功能上线,则关闭老模块对应功能,所有功能替换完毕,则老模块下线。 这个道理是普遍适用的,差别只是体现在模块的大小上。如果你的“小模块”是一个系统,那就部署新老两套系统,在前面的流量入口做控制,逐步把流量从老系统转到新系统上去;如果“小模块”只在代码层面,那就要有一段分发的代码,根据参数将流程转到不同的代码上去,然后,根据开发的进展,逐步减少对老代码的调用,一直到完全不依赖于老代码。 <img src="https://pic.code-nav.cn/post_picture/1688022738838552578/8jA10UqvbGafuw64.webp" alt="分发模块.png" width="100%" /> 这里还有一个小的建议,按照分模块的做法,将新代码放到新模块里,按照新的标准去写新的代码,比如,测试覆盖率要达到 100%,然后,让调用入口的地方依赖于这个新的模块。 最后,有了测试,有了替换方案,但还有一个关键问题,新代码要怎么写? 要回答这个问题,我们必须回到一开始的地方,我们为什么要做这次调整。因为这个系统已经不堪重负了,那我们新做的修改是不是一定能解决这个问题呢?答案是不好说。 很多程序员都会认为别人给留下的代码是烂摊子,但真有一个机会让你重写代码,你怎么保证不把摊子弄烂?这是很多人没有仔细思考过的问题。如果你不去想这个问题,即便今天你重写了这段代码,明天你又会怨恨写这段代码的人没把这段代码写好,只不过,这个被抱怨的人是你自己而已 要想代码腐化的速度不那么快,一定要在软件设计上多下功夫。一方面,建立好领域模型,另一方面,寻找行业对于系统构建的最新理解。关于领域模型的价值,我在专栏前面已经提到过不少次了。有不少行业已经形成了自己在领域模型上的最佳实践,比如,电商领域,你可以作为参考,这样可以节省很多探索的成本。 我们稍微展开说说后面一点,“寻找行业中的最新理解”。简言之,我们需要知道现在行业已经发展到什么水平了。 比如说,今天做一个大访问量的系统,我们要用缓存系统,要用 CDN,而不是把所有流量都直接转给数据库。而这么做的前提是,内存成本已经大幅度降低,缓存系统才成为了标准配置。拜 REST 所赐,行业对于 HTTP 的理解已经大踏步地向前迈进,CDN 才有了巨大的进步空间。 而今天的缓存系统已经不再是简单的大 Map,有一些实现得比较好的缓存系统可以支持很多不同的数据结构,甚至支持复杂的查询。从某种程度上讲,它们已经变成了一个性能更好的“数据库”。 有了这些理解,做技术选型时,你就可以根据自己系统的特点,选择适合的技术,而不是以昨天的技术解决今天的问题,造成的结果就是,代码写出来就是过时的。 前面这个例子用到的是技术选型,关于“最新理解”还有一个角度是,行业对于最佳实践的理解。 其实在这个专栏里,我讲的内容很多都是各种“最佳实践”,比如,要写测试,要有持续集成,要有自动化等等,这些内容看似很简单,但如果你不做,结果就是团队很容易重新陷入泥潭,继续苦苦挣扎。既然选择重写代码,至少新的代码应该按照“最佳实践”来做,才能够尽可能减缓代码腐化的速度。 总之,改造遗留系统,一个关键点就是,不要回到老路上。 ### 总结时刻 我们把前面学到的各种知识运用到了“改造遗留系统”上。只要产品还在发展,系统改造就是不可避免的。改造遗留系统,前提条件是要弄清楚现状,知道系统为什么要改造,是架构有问题,还是领域模型混乱,只有知道根因,才可能有的放矢地进行改造。 改造遗留系统,我给你几个建议: * 构建测试防护网,保证新老模块功能一致; * 分成小块,逐步替换; * 构建好领域模型; * 寻找行业中关于系统构建的最新理解。 如果今天的内容你只能记住一件事,那请记住:**小步改造遗留系统,不要回到老路上。**
