作者edwardboy26 (Yuho)
看板Soft_Job
标题[心得] 北美 工作 转专业 浅谈Leetcode 之我见
时间Fri Dec 1 22:06:54 2017
其实没想过我有机会在软体版发个文
毕竟大学是商科毕业的
但因缘际会 走上了第1001个电脑科学的路
背景什麽的在留学版也有分享过就不赘述
写在前面 这篇是主要给转专业
或是基础不甚扎实的人一些建议
主要谈的是很多人口中不耻的 “刷”Leetcode
首先我很感谢Leetcode 不是因为它让我进了不错的公司
而是他帮我一步一步地领进
从 “了解问题”到“设计程式结构”
最後利用演算法与资料结构来实现一个问题的解法
事情都有两面 端看自己怎麽想
有人觉得刷题对提升能力没帮助 只是照本宣科 公司还这样考根本乱搞
但我觉得我的收获可以完全从另一面来解读
条列这半年写Leetcode的收获
如果你要笑我连这些都不知道 怎麽念电脑科学
我只能说 谁没有学习的过程?
我晚了两年不代表我不能学 也不代表我以後不会变厉害
1. 看到一个问题我开始思考要用手上的什麽演算法与资料结构来解
这件事情跟工作我想是一样的
工作有目标 无论是解虫 或是产品设计 或是改善某种效能
都是利用已知的知识 加上手边人家写好的Lib 最後实作并达到解决问题
这个流程跟写Leetcode如出一彻 只是他把题目的范围减小的
变成一个相对简单但基本核心概念一样的过程
2. 写出简短易懂解不重复有架构的程式码
因为短时间时间的压力
很多时候我开始理解到与其一见到题目 有了最粗浅的想法以後
直接开始写程式码 後来因为没有好好的重复利用
导致原本30行可以解决的硬是被我写到了50行
(如果变成大型程式 3000 -> 5000不是闹着玩的)
不如静下心 把心里面的想法通通整理成可各自调用的区块
然後一步步一步实现
这样好找问题 以後也较简单修改
3. 拥有改进效能、可读性、多方面思考的直觉
很多时候题目一下就可以想出一个可行的解法
但很多时候内心就开始挑战自己 或是有个直觉就开始说
“这个感觉就有更好更快的解法”
“用这种方法感觉能解 但另外一种应该也能 好处分别是... ...”
当开始出现这种感觉的时候 就往前踏了一步
不满足於现在的效能 或想要用更好的方式解决问题
这不是大家心目中“好工程师”该具备的能力吗?
同时也让自己在看解答以前 多思考多想
我的确有曾经写过比第一名投票还容易懂 然後行数更少 并且拥有同样效能的码
如果我直接看答案 我就写不出来了
4. 阅读理解别人程式码的习惯
看别人的码 理解别人的逻辑不简单
拥抱开源更不简单
但是在参考别人解答的时候 就默默无形训练了这种习惯与能力
同时也会知道自己的程式在哪里该加注解 命名怎麽命最容易懂
哪里不要用太过於简短的简写 才方便阅读
5. 正确无误的写出20 - 30 行程式码
因为要求的缘故
我们常常无法写到一半看写得对不对 所以会要求一次写成功
这种训练让我在现在Project的实作上
程式码的出错率小了很多
不太会忘了宣告、加分号 或结构混乱 导致出一些很蠢的错误
这样对以後写大型开发程式的时候 效率有绝对的帮助
6. 实作的能力 与自信
很多时候有 有想法不代表能够写出来
而这也的确是我曾经最害怕的一块
我不知道怎麽实作我的想法
但是写题目写久了
开始慢慢发现自己的思考已经往确定实作的方向想的时候
就开始累积自信
知道自己一定实作的出来 只是要花时间想与学
这种自信与能力 无论对哪个产业我相信都是满好与满重要的
(机械设计我相信也是这种概念)
目前大概是这几点的收获
花了我大约半年的时间
我只能说 写Leetcode的确是对转专业的我拥有极大的收获与帮助
我也不觉得自己是只会写题目而不会解决问题
毕竟我所有写的过程 都是在解问题 而非背答案
写在後面
很多人觉得大家都一窝蜂了转来电脑科学是追求热潮
认为好好刷题就可以进到大公司的策略根本扭曲了电脑科学的本质
甚至觉得很多人只会刷题根本不会利用手边的工具解决碰到的难题
转专业就是比本科差
我想讲的是
很多时候不是我们笨 而是我们待的时间不够久 导致很多东西没经验
系统、结构、网路、IO这些东西都不会
但学无止尽 只要愿意一步一步走下去
十年後 我们也跟大学毕业六年的本科生写程式的时间一样久
只要付出足够的努力
我们也不会比本科毕业的差到哪里去
人都不是笨 愿不愿意学与花时间而已
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 173.62.252.231
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1512137217.A.DBF.html
1F:推 Mariobrother: 推 12/01 22:39
2F:推 orangepipe: 推 12/01 22:50
3F:→ pttworld: 解题和架构差蛮远的,尤其对完整的系统来说。 12/01 23:21
哦喔我指的不是system design
我指的比较类似function 的设计
有解过题的跟没解过题的
function写法差很多
system design 的东西我还没接触到也还没学 不能乱讲
4F:推 chung5566: 有同感!觉得真的有差 12/01 23:32
5F:推 abccbaandy: 觉得新人考这个OK,都工作几年了还考实在没意义 12/01 23:39
的确 有经验了都不是处理leetcode上这屁点大的事
6F:推 Hevak: 很蠢的错误那点以你举的例子一般应该可以直接用静态分析 12/01 23:57
7F:→ Hevak: 类的工具 (linter) 去处理掉 12/01 23:57
长知识了!谢谢
8F:→ Hevak: 至於结构乾不乾净那个就当然又是另外一个话题... 12/01 23:58
9F:推 s89162504: 大概只有第四点比较可信啦 练过解题的人完全不害怕读 12/02 00:20
10F:→ s89162504: 别人的code 12/02 00:20
11F:→ s89162504: 第二点纯属唬烂 做design跟演算法完全是两回事 12/02 00:22
我不是讲design啦哈哈 那个很难还需要多磨练 我也在增进那块的知识
我指的是code的一些比较基本的写法以及分类
12F:→ fake01: 训练脑袋,觉得很好 12/02 00:23
※ 编辑: edwardboy26 (165.123.107.15), 12/02/2017 01:29:32
13F:推 fishlinghu: 里扣对新手来说是有用 但是我觉得对工程师没啥用 12/02 07:26
14F:→ fishlinghu: 建议你工作找到之後就别再刷了 赶快把你说没学过的 12/02 07:27
15F:→ fishlinghu: 领域补好 一直刷下去没意义 12/02 07:27
16F:→ fishlinghu: 你真的要写扣 应该要做些专题 用正规的开发方法练习 12/02 07:28
17F:→ fishlinghu: 像是版本控制 还有写test code 之类的 12/02 07:29
Leetcode只是电脑科学的一小部分 只是恰好工作对这小部分要求
找完了工作就该好好回头补知识跟能力了
18F:推 monoceros629: 我觉得刷leetcode 很有趣啊,不为了什麽。无聊的时 12/02 09:22
19F:→ monoceros629: 候就刷一下。练出来的功力,会自然在每个小地方显 12/02 09:22
20F:→ monoceros629: 现 12/02 09:22
21F:推 bluebluelan: 豪豪 人家面我都只跟我聊天不考刷题QQ 12/02 12:23
22F:推 abccbaandy: 楼上才是正确的吧...现在全民刷题的歪风不知道啥时能 12/02 14:32
23F:→ abccbaandy: 结束 12/02 14:32
24F:推 sorryla: G社的学长说,连刷题你们都刷不好,你要怎麽说服人家你强 12/02 15:15
25F:推 ChoDino: 工程师演算法资结不搞好,老是谈架构说空话才是歪风吧 12/02 17:01
26F:→ ChoDino: 刷题真的是打好基础的好方法,也是公司最难训练人的部份 12/02 17:02
27F:→ ChoDino: 那些工具、套件,使用方法,教育训练一下不怕人学不会 12/02 17:04
28F:推 s860134: 基本功扎实,剩下都可以从古哥找到答案 12/02 17:09
29F:推 abccbaandy: 架构是不是空话,不就是面试官要想办法问出来的? 12/02 18:04
30F:→ abccbaandy: 一进去面试不管三七二十一先来排个树根本是偷懒吧 12/02 18:06
31F:→ abccbaandy: 当然面试官也很辛苦,很多事都做不完了还要被抓去面试 12/02 18:07
32F:推 sunsamy: 刷题真的是歪风,不切实际的成份大 12/02 18:14
33F:推 NCUking: G收了一堆ACM战神 等战神当了面试官 自然而然想到考解题 12/02 18:36
34F:→ NCUking: 顶尖公司就算了 反正面试官自己是神手 可以自己想题目 12/02 18:37
35F:→ NCUking: 一般跟风的公司 面试官只会从CTCI抄题目跟看解答 12/02 18:39
36F:推 strlen: 台湾90%的程式需求大概都用不到资结和演算法 12/02 19:24
37F:推 strlen: 当然我说的是leetcode那种的 广义来说 你随便写个if else 12/02 19:26
38F:→ strlen: 都算演算法啦 XD 12/02 19:26
39F:推 menshuei: 我觉得台湾的话老板是喜欢帮公司多赚钱的 12/02 19:41
40F:推 EngRookie: 要看产品啦...没有好的演算法跟资结是要逼死维护的人 12/02 20:01
41F:→ EngRookie: 吗 12/02 20:01
42F:推 sunsamy: 楼上逻辑有问题,好维护是看软体工程与架构,初阶的level通 12/02 20:16
43F:→ sunsamy: 常会认为演算法跟资料结构会比软体工程与架构来得重要 12/02 20:18
44F:推 sunsamy: 事实上很多可用的演算法与实作的资结上网抄就有了 12/02 20:22
45F:→ ku399999: 刷题不是歪风,把刷题当唯一指标才是歪风。我觉得有经 12/02 20:55
46F:→ ku399999: 验後也不代表这些不重要 12/02 20:55
挺认同的
47F:推 jj0321: 南部公司: 什麽是leetcode ?? acm解题是什麽? 12/02 21:25
48F:推 jazzter: 推推,请问最後去哪 12/02 23:01
※ 编辑: edwardboy26 (158.130.211.65), 12/03/2017 02:09:10
49F:推 TAKADO: 偶而刷题可以训练思路跟看看不同的解法,但只刷题却不愿意 12/03 10:11
50F:→ TAKADO: 花点时间读书学新技术却有点本末倒置。另外我有遇到几家 12/03 10:11
51F:→ TAKADO: 国外中型公司是面试前直接给你一个半成品solution跟一张 12/03 10:11
52F:→ TAKADO: 需求列表,里面是公司用的技术跟常遇到要实作的功能,24小 12/03 10:11
53F:→ TAKADO: 时之内能做多少算多少。我觉得这种比较有意思,看得出考官 12/03 10:11
54F:→ TAKADO: 的用心。 12/03 10:11
55F:→ TAKADO: 也能看出考生对不熟的套件/框架看懂技术文件的能力 12/03 10:13
这让我想到的确有公司会给一份一个礼拜的project来当interview
但好公司会给钱 即便只是算时薪 这样对双方都有尊重
避免公司找到不厉害的人 也避免花了20个小时完成一个project
结果直接只收个thank you and wish you luck
56F:推 senjor: 其实我一直觉得对会写程式的人来说,Leetcode之类的就算到 12/03 12:20
57F:→ senjor: Hard也只是花的时间的多少还有要把它整理多乾净的差别而已 12/03 12:20
58F:→ senjor: 看过问人家Leetcode能写到什麽程度的题目算是最奇怪的问法 12/03 12:21
59F:→ senjor: 就好像几个号称自己会游泳的人互相问说你能游几百米一样怪 12/03 12:22
这个我想提些不同的观点 有时候能够看到leetcode上神人的解法 还是很兴奋的
觉得天啊这种资料结构竟然有这种应用 到底他脑袋怎麽做的
最厉害的人是 用最简单的资料结构 最简单的语言 最简单的算法
解一个大家都觉得超级难的问题 那种感觉其实满好的XD
※ 编辑: edwardboy26 (173.62.252.231), 12/03/2017 13:46:10
60F:→ senjor: 当然,不过这就是说解法多漂亮,而不是说能解到多难的题目 12/03 14:00
61F:推 sppqre: 推分享 12/05 08:10
62F:推 THEWORLDS: 刷题是最基本的 前面要练的思考逻辑很重要 12/05 10:20