作者lovdkkkk (dk)
看板Soft_Job
标题Re: [请益] 後端工程师要如何更优秀
时间Wed Jun 5 12:17:53 2019
大概提一些个人觉得有用的观念, 可以做的方向以及建议顺序
一些个人觉得蛮有用的观念, 写在前面
* 聚焦在目的, 而不是工具/方法/手段
打个简单的比方,
做出好吃的料理是目的, 而用什麽器具、料理方法、调味方式是手段,
具焦在用的器具或调味品或许能让你找到最棒的锅子 (?) 跟调味料之类的,
但另一方面也可能让你一旦没有那特定的锅子可用就成了料理白痴
反之具焦在做出好吃的料理,
思维上就会是 "有哪些工具/哪些材料的前提下, 如何能做出好吃的料理"
也会促使你研究、实践各种手段来试着达到该目的,
并反思优/劣/利/弊/能如何再改善调整等, 多加上反思会更能进步
* 凡是都有代价
有这个观念, 你就不容易只是停留在 "用工具/方法/手段" 的阶段,
它会促使你学一样新东西时,
主动搜寻
XXX advantages/disadvantages/drawbacks
XXX vs OOO
XXX OOO tips
XXX best practice
然後认真仔细地看上二三十篇文章, 去了解它的好与坏,
这让你在学东西的广度与深度上能有很大的改善
比如说 SRP 你可能就会找到这个
https://sklivvz.com/posts/i-dont-love-the-single-responsibility-principle
然後就可以看一看, 想一想, 再吸收成自己的东西
然後是一些能精进的方向
* 让程式易读、易改、容易扩充、不容易改东坏西
这部份就是你目前有在嚐试的 OOP/SOLID, 刚开始这就很够了,
前面有人推的 Clean Code 跟 Clean Architecture 也可以看看,
ref:
https://www.tenlong.com.tw/products/9789862017050
https://www.tenlong.com.tw/products/9789864342945
https://www.books.com.tw/products/0010579897
https://www.books.com.tw/products/0010786994
网路上还找得到有人对 Clean Code 做的重点整理
ref:
http://gitqwerty777.github.io/cleancode/
其它像 KISS, Composition over inheritance,
convention over configuration 也都是简单又好用的一些原则
ref:
https://bit.ly/2WoLIPI ,
https://tw.twincl.com/programming/*662v ,
https://bit.ly/316hYFO
另外可以学一下设计模试, 像 深入浅出-设计模式、
重构--向范式前进 都是不错的书,
ref:
https://www.tenlong.com.tw/products/9789867794529
https://www.books.com.tw/products/0010309237
https://www.books.com.tw/products/0010399556
不过要注意, 目的是 让程式易读、易改、容易扩充、不容易改东坏西,
而 OOP/SOLID 其它原则和模式等则是 工具/方法/手段,
要时时注意使用它们有没有什麽代价, 是不是过了某个界线就会让代价大於好处,
以免为了贯彻手段而忘了目的
* 让程式效能好,执行速度快、使用的资源少
这部份说来很多很杂
首先 OS 是要的, 不用全部很熟, 但最少有一些基本知识,
例如速度是硬碟 < 记忆体, 记忆体不足会引发 Thrashing
Process 吃的资源比 Thread 多,
多 Thread 对 IO bound 比对 CPU bound 的问题有效果
存取同一变数需要处理锁定问题等
然後资料结构跟演算法是必要的, 这部份虽然不用急着补, 但补越多效果就越好,
最开始先知道 Array/List/Linked List/Queue/HashSet/HashMap 等的差异
就会有不少的帮助, 推荐经典教科书 Introduction to Algorithms
https://www.tenlong.com.tw/products/9780262033848
https://www.books.com.tw/products/F011708546
其它比较杂、需要了解後端程式以外的部份
像了解使用的语言/框架的资源耗用状况,
了解使用的伺服器对应不同的负载情形该如何设定,
这在不同语言/伺服器会不同, 例如 nodejs/nginx 和 Java/JBoss 就差很大
了解资料库的运作也会有帮助,
能协助你规划哪些事情由程式处理, 哪些靠 SQL 解决,
如何能尽量减少 lock 等等
对前端的认识也会有帮助, 能协助你决定流程该如何切分,
哪些事可以在使用者操作途中处理等等
不过以上这些有点杂, 可以放比较後面
* 让程式容易布署、设定
例如用设定档或 DB 开设定的 table 而不要程式写死,
读档时设法使用通用的方式等,
例如 JAVA 包成 jar, 包成 war 跟跑在 IDE 能用的资源读取方式会有差异
这部份留意一下你的程式会更容易应用在多种情境,
而不会换个 package 形式就各种跳 error
这也是不急, 有空再了解就好
* 让程式容易验证、除错
这有几个部份,
适当的 Exception handle 方式, 不要随便自己 catch 掉,
并设法让 error log 有足够的资讯且容易查阅,
自动测试则能让你经常测, 早期发现问题较容易修,
对容器、CI/CD、shell/batch script 的熟悉
则能让你容易布署整个测试环境做整合测试
初期先以 log 及 unit test 为主就很够能改进很多了,
有空再往下摸
* 能更好的和不同职能的人沟通
这部份就只能靠多了解其它部份的相关知识,
多了解领域知识, 就能更好的和 SA/SD 沟通,
更了解前端或机器/系统, 就能更好的和前端工程师或维运人员沟通,
也对开发及查问题有帮助,
比方前後端怎麽分工, 哪些前端处理哪些後端做, 没反应是不是前端就没送,
连不到请维运开一下防火墙,
一直挂是不是清硬碟的排程没有跑或实体机器资源不够等等
建议顺序
大至上就是 前置少, 影响大的优先, 前置多, 影响较小的放後面,
但也不必一个学完才学另一个, 可以并行,
看个人取舍
OOP/SOLID 及各种其它原则等
前置: 使用的语言的基础
影响层面: 大, 影响到日常开发、效能调整、测试除错等各个层面
需要时间: 极长, 基本上等同於你的开发生涯,
会不断在不同情境下有不同的想法, 持续修正
unit test
前置: 使用的语言的基础, unit test 工具
影响层面: 大, 做各种修改时可以更放心大胆的改,
改完後几秒内知道有哪里坏掉
需要时间: 短, 基本上有固定套路
设计模试
前置: 使用的语言的基础, 及一些较进阶的语法
影响层面: 大, 影响到日常开发、效能调整、测试除错等各个层面,
需要时间: 极长, 基本上等同於你的开发生涯,
会不断在不同情境下有不同的想法, 持续修正
OS
前置: 无
影响层面: 中, 主要是对效能调整及除错有帮助
需要时间: 长, 很多东西一下子可能不太能理解,
建议记录下来後先略过, 时不时再回头重看及查资料
不必非要搞清楚後才继续, 快速增加能吸收的东西比较重要
资料结构跟演算法
前置: 基本逻辑, 一些些基本数学
影响层面: 大, 除了效能, 也影响架构程式及整体系统的能力
需要时间: 极长, 基本上等同於你的开发生涯,
会不断在不同情境下有不同的想法, 持续修正
容器、CI/CD、shell/batch script
前置: 一些些基本命令列指令, 基本 OS 操作
影响层面: 中, 主要是布署与测试的部份,
需要时间: 中, 基本操作可以很快上手, 建议可以先挑一组工具学会使用,
之後再慢慢补上其它相关知识
※ 引述《csjs87 (思念的季节)》之铭言:
: 各位年薪三百万的大神们好,小弟不才又上来请益了。一年前为了选择资策会的课程在版上发了问,有幸获得许多人的回覆。
: 从资策会毕业、顺利找到工作也一阵子了,现在月薪37k,主要是协助开发後端。但我碰到一些对於自己不足的地方,想再次请教各位。
: 一、
: 因为公司没有一套完整的教育训练或是架构的教学,所以即使我有尝试在我负责做的小工具、api中尽量使用"我认为的oop观念"、"solid的开发原则"。但还是不晓得是否正确,同事们大多也都很资浅,加上没有太多时间帮我看(专案忙)。我要怎麽检视自己的code是良好、容易维护的呢?
: 二、
: 偶尔会看版上或是104徵才需要什麽样的能力,为将来不管跳槽或是谈薪水更有筹码。我印象中常看到的有云端架设相关(aws、azure)、程式设计上(单元测试、graph api)、其他(CI/CD、Docker容器、TDD)。虽然都有查过也大致知道是什麽,但也仅此而已,更不晓得知识还很浅薄的我有没有误会什麽。
: 三、
: 最後是一些比较底层的资料结构、计算机概论这类都几乎是0知识。虽然计概有自己看台大开放课程的计算机概论,是多少有学到一些,但又好像不是我现在急迫必要的知识。听说资工有本圣经恐龙本,看过目录发现,很多都是我常常看到的陌生词汇。I/O、thread、Process等等,我觉得好像不看懂这些我就很难更精进。
: 其实我本身不是“非常”热爱写程式的人,我会在写code的时候为解出bug感到开心,也会边骑车边想程式的事,看到好像很神奇的新技术新闻也会很兴奋,也想做side project,想使用新知识。但到了休假日,也很少真的着手进行。
: 总之我现在稍微有点迷惘,对於程式这条路我觉得我才刚起步,也不想离开。但学海无涯,光上面就太多东西要学。
: 根据我自己的感觉,只知道自己暂时还不太想钻研前端。而对於我上面提到的各种知识,能怎麽安排、规划比较好?谢谢大家。
: -----
: Sent from JPTT on my Sony G8142.
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 125.227.154.169 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1559708280.A.C11.html
1F:推 NAVYmaker: 感谢大大 06/05 12:24
2F:→ MOONY135: 最近是怎样 U值文大喷发 06/05 12:41
大概大家看到想精进的人都很兴奋 XD
3F:推 devilkool: 感谢分享 06/05 12:42
4F:推 oceanblue21: 推 讲的很详细!! 06/05 12:52
5F:推 b81314: 这篇赞 06/05 13:33
6F:推 expup: 大推 你人真的非常好 06/05 14:22
看情况, 只能说人都有不只一种面貌 @@
7F:推 v9290026: 推推 06/05 14:36
8F:推 jeremy616: 好文推 06/05 16:56
9F:推 cz75: 谢谢大大,提供好的文让软工版起飞QQ 06/05 19:45
10F:→ lwtech: 不要再躲了,快去自首,你就是凶手。 06/05 22:27
对不起我承认桌上的铜锣烧是我吃晫的 QQ
11F:推 genius945: 推 帮找个错字 exception 那边应该 cache => catch 06/05 22:41
已改 0rz
12F:推 genie920: 推推,真的谢谢你的分享! 06/06 00:13
13F:推 umum29: 推 06/06 00:36
14F:推 frankshih: 近期真的U值文连发,给推 06/06 07:10
15F:推 molopo: 好文 06/06 07:55
16F:推 showken: 好文 谢谢分享 06/06 09:42
17F:推 IamTD: 赞 06/06 09:52
18F:推 qwe85158: 推 06/06 10:38
19F:推 aliasber66: 好文推推 06/06 11:50
20F:推 LinNine: 推! 谢谢你的分享 06/06 12:41
21F:推 cocoyan: 推 06/06 17:16
22F:→ jack42107: 还是鼓励大家支持天珑书局啦 06/07 15:35
补上天珑连结
23F:推 jack42107: CD完了 补推 06/07 15:47
24F:推 kasimEnix: 软工需要更多的优文! 06/07 19:01
25F:推 jlshoo: 推个 06/08 13:38
26F:推 boy955403: 推推 感谢大大分享 06/08 18:18
※ 编辑: lovdkkkk (36.226.172.204 台湾), 06/09/2019 11:20:53
27F:推 king4647: 推 06/10 13:47
28F:推 mirror0227: 实用推 06/11 13:22
29F:推 vincentbiao: 推用心,感谢大大 06/11 22:25
30F:推 games5602: 推 06/14 14:23
31F:推 nicks0904: 推好文 07/04 20:38
32F:推 cotbel: 推优质好文 07/09 23:15
33F:推 ccnancy: 谢谢分享请收下我的膝盖 04/23 11:35
34F:推 papple23g: 推 内文很多都是痛过才知道重要qq 08/16 05:03