首页 > 【前端】【成长过程】我是如何从双非非科班到大厂程序员的?
头像
xsj201904252033968
编辑于 2020-10-29 09:43
+ 关注

【前端】【成长过程】我是如何从双非非科班到大厂程序员的?

个人标签: 2020届普通一本大学信息与计算科学专业, 目前在字节跳动抖音创新项目团队从事前端开发。

前言

原谅我的标题党, 这是希望文章得到更多阅读的小技巧。 毕竟写一篇文章就像你发一条朋友圈一样, 总是需要别人认同, 否则写日记就好了。本文主要写给希望未来在互联网私企从事开发工作的大一大二同学, 更多地希望帮助到像我一样非名校, 非科班,缺少良好氛围陷入迷茫的后辈们。

这篇文章大概会从个人经历、 认知、 规划、 工程师素质、 突破、 书籍推荐几个方面来阐述。 文章仅代表个人观点, 如有不同的看法, 欢迎讨论。

个人经历

为了让后面梳理的整个内容更有说服力, 所以这部分会写的非常详细。 因为并不想去写一篇鸡汤, 什么是鸡汤? 个人理解就是乍一看鼓舞人心, 但细细品味却无法借鉴的内容。 你可以说”天道酬勤“, 也可以说”1%的天赋比99%的汗水更重要“。 脱离具体条件、 事例讲道理的行为无异于耍流氓。

接触

第一个阶段的特点是浅尝辄止, 许多东西如果copy网上的代码能够运行就没有继续深究了, 此阶段大量的时间花费在低级的语法错误和寻找现成的代码中。

入门编程是在初中时突发奇想帮助家里做一个网站, 于是从Dreamware这种可视化软件上手, 在初中逐步学会了HTML、 CSS, 入门JavaScript, 高中时入门PHP奠定自学的习惯和基础。

同时***始学习很多编程的不少都是大佬了, 我的入门时间是非常之早的, 所以可见良好的规划和认知决定的学习的上限, 所以这篇文章的目的是通过详细的个人经历和感悟, 帮助读者突破上限, 避免跟我一样事倍功半。

在这个阶段由于升学的压力和没有良好的学习习惯, 实际能力并不强, 重在培养了自己自学的习惯和自信。

用现在的视角去看这个阶段, 为什么没有发展的更好, 外部原因是由于父母的学历也仅是小学和初中, 在这个阶段并不支持我, 更没有条件像一些同事在中学阶段参加NOI(全国信息学奥赛, 成绩优异能报送一流985甚至清北)。 内部原因是自己当时的目标过低, 浅尝辄止, 比如为了实现一个相册, 把懒人图库(一个各种脚本素材的网站)的demo搬过来, 也不先学习JavaScript, 照猫画虎地修改套到自己的网站上, 只要能跑就不去理解每一行代码, 也不会甄别代码的好坏。 整体的进步是非常被动的, 发现可视化工具做出来的网站在不同浏览器上会错乱, 才无奈去学习HTML、 CSS, 发现有时候怎么都无法把现成的代码套到自己的网站上, 才被动零碎的学习JavaScript。

入门

第二个阶段的特点是在迷茫中开始探索计算机的各个领域。 这大概是大一的时候。

在我高考完的第三天, 我花了一个月的时间重新熟悉了高中前所学的内容, 使用JQuery + PHP从底层开发了一个简单的信息管理系统(包括网站栏目后台设置, 文章、 图集发布, 类似于WordPress)。 然后入坑了Cocos2d-js、 Cocos Creator开始开发游戏。

进入大学后, 年少轻狂, 迫切地想做一些事情, 于是找到了想创业的学长, 从校园二手网站开始, 这个项目是比原先的简单的信息管理系统, 在业务上更加复杂了一些(购物车、 订单的数据模型还是比文章复杂许多), 技术栈使用了ThinkPHP, 但并没有本质上的突破。 业务上整个网站也没有真正运行起来, 一起做这件事的学长除了草草卖了一次二手书(还是通过线下卖的)也没有继续去做了。 在这件事搁浅后参加了互联网+大赛, 这件事成长不大, 仅仅是把技术栈从ThinkPHP切换到了Laravel, 虽然框架的复杂度更高, 接触的概念更多一些, 但本质上没有大的突破。

这个阶段的误区在于, 进入大学后被花花世界(至少跟高中相比)所迷惑, 在一些无关紧要的事情上耗费了一些精力。 也没有看清创新创业大赛的本质。 总的来说, 在我们这样的学校和学院(理科, 偏理论难以落地), 做创新创业比赛的氛围是不务实的, PPT导向, 而且比赛本身也不是技术导向的比赛, 导致做的事情略微背离我的方向, 但总的来说也得到了技术成长。

另一个误区贯穿我大学生涯, 就是过于好强, 虽然我明确自己学习计算机的优先级更高, 但因为成绩在及格线上(花费在数学上的时间极少)消耗了不少情绪, 不甘于及格, 但又不能为了它影响我学习计算机的主线, 在这样的矛盾中产生迷茫、 挫败, 无谓的浪费精力。 我相信这是跨学科学习的同学可能都会遇到的问题, 如果你决心跨专业发展自己, 就要心安理得地接受自己在本专业上的拙劣, 用最小的成本完成毕业的条件, 更大限度地去发展自己要学的学科, 毕竟, 你已经比科班的同学要少很多可支配的时间和精力了。

由于太过迷茫, 这个阶段我开始寻找答案。 班主任给我的答案是好好学习数学, 数学有无用之用, 对思维的锻炼很大。 但这一答案与我这么多年对计算机的认识完全不同。 而转专业到软件学院的学长的答案是, 应该学习数学, 到后期研究的就是算法, 也就是数学。 针对这一答案, 我后面会详细解析。

积累

第三个阶段的特点依旧是迷茫, 但是在迷茫中幸运地积累了在计算机领域的一些核心竞争力。 这大概是大二时候做的事情。

在大一结束的时候, 我回头看这一年, 除了把高中之前所学变得更扎实一些, 似乎没有本质的突破, 于是我在知乎上寻找答案。 开始学习数据结构, 入门的书是《算法》第四版。 在外部机会探索上, 由于在学院的表彰大会上了解到有学长参加蓝桥杯拿了省三, 于是开始了解计算机的竞赛。 这个阶段我开始摸索到学习计算机的一些方法论, 比如在学习《算法》第四版这本书中, 我的学习方式是慢慢看懂一个小节的内容, 第二天再自己动手实现, 依旧没有弄清楚的地方再回过头看书这样的模式。

参加比赛的结果比预想的好, 可惜最终只拿了B组的国二。 在此之后, 入坑《Java编程思想》和《算法导论》这两本我至今依旧不能完全读懂的书。 出于兴趣, 我继续在游戏开发上探索, 开发了诸如水果忍者、魔塔、塔防游戏的一些小作品。 从某种角度来说, 游戏开发的门槛比web高, 因为不同的网站整体的思路相似, 所以在web开发方面有很多成熟的解决方案, 包括框架等, 很多是开箱即用的, 往上填充业务逻辑即可。 游戏方面虽然有游戏引擎的存在, 但是不同类型的游戏在整体的面向对象设计上差别太大, 所以非常考验综合的计算机素质。 于是在这个阶段我开始重新思考自己写的代码的质量, 学习了《重构:改善固有代码设计》, 在游戏开发过程中一个文件动辄几百行, 不同的类之间如何组织和调用也是一个很头疼的问题, 于是我开始学习《设计模式》, 当时真的被这本书坑了很久, 由于使用的是JavaScript, 很多从Java出发讲设计模式的书并不适应, 所以这个阶段阅读了大量JavaScript的书和博客, 博客例如汤姆大叔的《深入理解JavaScript系列》, 动物书系列的《JavaScript语言精粹》、《JavaScript模式》等, 曾探的《JavaScript设计模式与开发实践》。 在网络上学习了WebSocket, 算法(传统意义)上学习了A*算法等。

这个时候做的最宝贵的事情, 是自己模仿Cocos Creator和Erget开发了自己的一个简易的HTML5游戏引擎,包含基本的场景系统、 精灵系统、 事件系统、 动作系统、 动画系统等。 在这个过程中把这个阶段看的书更深刻地运用理解, 也成为我入职字节后的第一个技术分享。

这个阶段整体是比较满意的, 有很大的进步。 具体的误区还是前文所述在自己本专业成绩不佳上消耗了精力。 另一个误区是这一阶段我已经学习了PHP、 JavaScript(包括TypeScirpt)、 Java, 在后面的语言选择上也有所纠结,常常能在社区上搜索学习哪种编程语言这种问题, 看不同的立场观点撕逼,而在担心自己没有选择最好的方向而焦虑迷茫中。

在学习方法上的进步是开始梳理一些博客, 虽然质量不仅如人意, 但开始有总结的习惯。

这个阶段我开始在Cocos Creator的论坛上寻找答案, 帖子在这:

数学哪些部分对计算机有用

依然是得到了不同的答案。 回想起来, 许多观点不能说错, 但是不适用于自己。

偏离

第四个阶段的特点是开始走向和之前完全不同的领域, 入坑AI。 这是大三做的事情。

看了周志华的《机器学习》, 李航的《统计学习方法》(这个大佬目前在字节)等等一系列的书。 在被忽悠给学校的实验室做项目之后, 出了我的第一篇核心期刊论文(就不献丑贴文章名了)。 然后参加了一系列的数学建模比赛, 没有做出一些成绩, 倒是有些遗憾。

这个阶段做的对现在比较有意义的事情是为了帮舅舅做一个财务系统, 技术选型上选择了vue取代原先的JQuery, 为我后来入职字节奠定了一个面试基础(一个MVVM框架都不会就想拿前端校招offer也太过分了)。

这个阶段开始意识到自己对外部的探索太少, 大三下的五月, 朋友告诉我阿里在招暑期实习生。 出于当时PHP在大厂中基本被淘汰了, 听闻游戏行业的加班非常严重, 于是选择了认为比较容易的前端。 由于在前端领域的学习并不深刻, 不幸一面挂。 再加上当时身边的同学都开始准备考研, 对自己的学历非常自卑, 也就开始准备考研, 选择了浙大作为目标。

由于选择考研之后, 做AI方面的开发比较贴合读研做的方向, 性价比也更高。 但是在大三一年的学习中认识到自己对于这一方向实在没有兴趣。 考研后期渐渐感觉难以上岸。

侥幸上岸

在11月底, 渐渐认识到自己考上浙大是机会渺茫了。 毕竟在朝着自己不感兴趣的方向前进, 缺少底层的动力。 于是我做了几乎是人生中第一个半途而废的决定。 放弃考研, 找工作上岸。 投简历的辛酸就不细说了, 除了爱奇艺、 字节、 京东, 其他大厂中厂基本不给机会, 简历挂, 小厂几乎也是挂。 最终拿到了一两家小厂、字节、 京东的offer。 大概是人生这么多年连再来一瓶都几乎没有中过, 从统计学来说, 这时候该运气爆棚了。 短短的一个多星期, 我就从放弃考研投简历被刷的痛苦到拿到offer。 面经可以参考我CSDN的帖子。

字节跳动前端面经_elegant coder-CSDN博客

持续推销~ 浙大计算机的机考可以用PAT考试代替, 关于这部分我的博客从题解到总结梳理的比较完善了:

【置顶】【PAT】PAT甲级题目及分类总结(持续更新ing)_elegant coder-CSDN博客

说完了个人经历, 下面就是一些感悟了, 首先从认知开始, 认知是我们做一切事情的基础和源头。

自我定位

要寻找适合自己的答案, 在这个答案上制定目标和计划, 我的经历中有这样一些答案, 不能说他们错, 但对于我不适用, 所幸我没有听从。

班主任: 好好学数学, 数学对于思维的提高非常有作用。
所说不差, 但是对于我从事软件开发这个方向来说相关性太低了。 这就跟锻炼好身体从生理上提高自己的精神状态, 然后你可以考个好成绩一样。 总是不错, 但你不会因为这个把大部分的精力都拿去做体育运动吧~

学长: 计算机到后面就是研究算法, 算法也就是数学。
所说也不全错, 算法和数学相关(如果你看看《算法导论》这本书, 4个作者中好像有2个是斯坦福的数学兼计算机博士), 但对于传统的数据结构, 对于大多数人的水平, 还是在于理解数据结构本身的工程思想更为重要, 数学并不是核心的部分(其实会算算法复杂度也就差不多了, 除非你研究数论、图形方面的内容)。 或者计算机图形学等一些相对小众的领域, 对数学的要求也比较高。 至于人工智能(工作后大多从事算法工程师、算法研究员岗位), 这个算法的含义和原先讲的算法(数据结构)的概念就相差甚远了。

网上骚扰的老司机程序员: 重要的是业务。
由于他从事的是自己做一些外包项目,更多的是一种商业, 从技术复杂度上来说也许并不高, 重要的是对项目的理解。 再加上已经从事了20年的编程, 也许纯技术部分很早的到达了瓶颈(对他来说), 所以才说业务更重要吧~。 当然在你工作之后, 业务会越来越重要。

外包朋友: 做前端最后转产品比较好。
现状是中小厂和外包业务, 由于技术复杂度不高, 加上前端这个领域比较年轻, 所以待遇和天花板确实比较低, 地位不如后端。 但是在大厂, 同级别的前端和后端待遇是一样的。 这里推荐了解前端的一些大神, 比如阿里的玉伯, 尤雨溪等, 这里分享玉伯的感悟:

我的前端成长之路 · 语雀

我最终的定位还是在软件开发, 具体到前端这个方向上成长, 努力成为一名合格的前端, 进而成为一名优秀的前端。

规划

人总是会幻想回到过去, 如果能回到过去, 我会这样规划自己:

大一可以主要打基础, 把计算机基础课程, 主要是网络、OS、 数据结构学扎实, 计组相对离软件更远一些。 大二开始学具体技术, 从web开发切入, 学习前端、 (前端也可以换成客户端),后端或者游戏开发等, 目前主流是这几个方向, 根据自己的兴趣来选择。 这个阶段可以学习的广泛一些, 主要是知识的广度。大三准备具体方向的加深学习, 同时刷题准备leetcode就可以了。

这也是适用于大多数想从事软件开发的同学的大概方向。 大二的时候可以整体认识一个领域(web开发或者游戏领域), 然后寻找自己比较感兴趣的点, 比如做web的前端还是后端, 游戏的客户端还是后端。 然后进一步深入学习。

学习的方法论

我个人是很排斥培训班和视频教学的, 它们的特点是浅入浅出, 效率低。 当然, 在你未入门的时候用这样比较低门槛的方式来学习也未尝不可, 但是要渐渐学会看文章、 看官方文档、 自己看源码来学习。

另外跟着一个太成体系的教程一步步走, 容易导致只知道这样写, 不知道为什么这样写? 有时候适当的错误的探索也是必要的, 踩坑本身也是一种学习。 跟着视频教程抄一个项目, 和自己先了解做一个项目需要学习的知识, 从了解知识->写demo->组织成一个项目这样的方法来比。 后者花费的时间当然是前者的很多倍, 但是学习的深度和积累的学习素质是前者望尘莫及的。

毕竟计算机工程领域变化太快了, 某种意义上学习的能力比具体的知识更重要(一定程度上)

学习的习惯

最好让自己的知识体系化, 也就是多去思考知识之间的联系。 产出博客, 即时做的不是那么好, 但写博客总比不写博客要强很多。 这方面的佼佼者要数掘金上的神三元(是2021届的实习生, 目前在字节跳动实习), 不仅能学习, 还能对一些内容做深入的思考产出文章, 这样在校招中是非常优秀的。

重视基础

许多知识, 例如网络知识、 数据结构等基础内容, 在工程上看似无用, 但实际上能给你提供更深层次的思考。比如你了解每个GET、POST请求都会携带cookie, 那么就会知道限制cookie的大小也是优化网站性能的一种手段。

由于工程领域发展过快的问题, 常常出现另一种极端。 只要基础扎实就好了, 上层知识无所谓。 这也是不合理的, 除非你ACM达到亚太区水平, 但是如果完全没有工程基础的话, 拿到校招offer也是不太可能的。

另外许多人鼓吹只要根据面试技巧来训练, 像数据结构、网络安全这些内容短时间突击即可, 这样是不扎实的, 即时短时间内应试上岸, 也影响工作后的发展。

突破瓶颈

重新来review一下我的经历, 特点是起步早, 但是每个阶段都由于认识的狭隘限制了上限。 这个瓶颈大多数人学生时代都会遇到, 当你可以去完成一个比较完整的项目, 比如一个校园二手交易网站之后, 你就会觉得学无可学。 你会觉得学习框架底层的源码没有意义。 这是由于当前的认知的瓶颈。 哪怕只是做一个博客, 你如果有下面的考量, 就会发现做一个博客做的好也是很难的事情:

体验: 如何解决兼容性问题? 比如你在IOS上点击输入框会出现蓝色边框, 在Android上点击输入框可能会被键盘遮挡等等。 如何衡量网站的体验?

性能: 可以接触的知识就太多了, 从面试常问的图片懒加载,到网络知识层面的合并请求等手段, 到跨端到客户端的数据预请求、 页面离线化, 到前端工程的SSR等。根据不同设备分辨率按需加载图片等等。这一块就可以画一个非常大的知识网络图了。

质量保证: 如何去做网站的监控, 包括白屏监控、 错误上报等等。 如何发现内存泄漏, 如何做自动降级等等。 如何做CI/CD保证工程质量和流程规范等等。

学会实现功能只是一个业务的起点, 当然如果你未来从事一些低端的外包, 可能实现功能就是全部了。 所以还是需要努力进入更好的平台, 提高天花板。

即使是实现功能, 其实也是非常复杂的, 比如如何写一个云文档, 如何做一个低代码可视化建站平台, 如何做一个脑图项目(涉及绘制的性能优化、 自动布局等等)。 这些都是非常复杂的。

可惜在互联网上充斥了太多前端画Button, 后端CURD这样的自嘲和抹黑, 其实可以学习的太多太多了。

认清现实

我们可以来参考一下腾讯的情况:
图片说明

做一些减法

说了这么多, 要做的事情太多太多了。 而一个人的精力是有限的, 我觉得我能走到今天很重要的一点是不打游戏, 虽然我身边的同事大多也打游戏, 但是他们在名校中氛围更浓厚, 方向更明确, 有学长学姐带着少走弯路。 我最近感悟到我们普通人需要有一种愚直的心态, 踏实积累, 先付出, 再求回报。

写在最后

最后安利下我之前在bilibili做的视频(看看这熟悉的标题党):
双非本科进一线互联网工作?你也可以!!!_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

目前我在字节跳动抖音创新项目的前端团队, 欢迎发简历到xushaojun.0@bytedance.com
内推可随时发邮件给我查询进度!
也欢迎评论、私信。

全部评论

(10) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

近期精华帖

热门推荐