一转眼工作已有 8 年,前两天公司一位初入职场的同事希望我给一些建议与经验。我觉得这个话题很有价值,这里以个人的想法与经历写成此文,希望给年轻的开发者们一些启发。
我工作过的公司有 4 家,NVIDIA, Google, Slide 和 Glow。其中两家是知名的大公司,Slide 我是D轮过后加入的,那时约 150 人。Glow 则是从它第一天创立,一直走到现在。个人的工作也从 Developer,Tech Lead,Engineering Manager 到 CTO。这些经历使我对程序员的个人发展之路有比较全面的看法。
如果你问一个年轻的前端开发人员,你在今后的 3 年内如何提升自己的能力?他可能会说“我现在对 Web 前端比较熟悉,但我想深入了解 AngularJS,另外 React 现在发展的很快我也想看一下。之后,我会花时间去学习 iOS 和 Android 开发。”看上去不错,但缺乏系统性的目标。或者说,他制定了学什么,但对为什么要学这些并没有仔细的思考。
在技术领域,有太多的东西会迅速的过时,如何利用有限时间,最大化你的长期收益?这里我可以给出几条建议
打造你的工具箱
工欲善其事,必先利其器。每个开发者都应该有一把自己的瑞士军刀,在将来漫长的职业生涯中,这些工具可以为你省下宝贵的时间,并帮助你更好的组织个人知识库。举两个例子
- 一套高效的开发环境
- 一个信息采集器和一本笔记本
高效的开发环境
我们可以从编缉器谈起,这里有 IDE vs Text Editor,有 Vim vs Emacs,有 Sublime vs Atom,那该如何选择呢?在做选择之前,我们先想想自己的目标。我们希望这是一个长期的投资,这款编缉器能被长期使用,在这个过程不断的打磨,使其能完 全适合自己的习惯,最大化编缉效率。如果程序员是侠客,编缉器则是他手中的剑。
虽然我是 Vim 的重度用户,但我觉得当年选择 Vim 时有欠考虑。如果让我重选一次,我的第一选择会是 Emacs,第二选择会是 Atom。Emacs 已存在 30 年,社区仍然活跃,其可扩展性在编缉器中无人能出其右。Emacs 的脚本语言 elisp 又是 lisp 的一种 dialect,我觉得对 lisp 的学习可以提升程序员对编程核心思想的理解。另一个加分点是 Emacs 由于其本身的高门槛及 lisp 特质,吸引了大批高质素的程序员,其社区可谓藏龙卧虎,更诞生了像 Org-mode 这样神级的插件。反观 Vim,Vim 的精髓在于 Mode editing,这是值得学习的,可以极大提高文本编缉的效率。但当你熟悉了这一理念后,我觉得可以转投其他编缉器,因为 Vim 的架构与 Vimscript 限制了其扩展性。Emacs 通过 Evil 插件非常完整的支持了 Mode editing,其他主流的编辑器也有类似插件,所以你一旦掌握了这个理念,在别的编辑器中也可以发挥作用。可能有人会说没有一个 Vim emulator 能做到 Vim 100% 的功能,但重点不在于某条指令是否被移植,而是 mode editing 思想的精髓能否被移植,我觉得答案是肯定的。
再看 Atom vs Sublime,Atom 的可扩展性非常好,它的大部分核心功能也是以插件的方式实现,这点与 Emacs 有异曲同工之妙。并且其开源的特性,使我相信它有比 Sublime 更持久的生命力。
关于 IDE,我的看法是,我不排斥 IDE,但每个 IDE 都是为了某个特定的任务或是编程语言服务的。做为一个有追求的程序员,可以用 IDE,但依然需要精通一个强大的通用编缉器。
类似编缉器,高效的开发环境还包括 Shell,Launcher,窗口管理器,文档阅读器等等。其中有一部分只需要你化很少的时间就可以完成配置,它们的投资回报率是非常高。
信息采集器和笔记本
前者是用来收集别人产生的信息,后者则是收集自己产生的信息。前者一个简单的例子就是浏览器的 Bookmark。你需要能随时将一组有用的信息归档,并在未来的某个时刻快速找到它。后者最直观的例子则是 Mac OS 或是 iOS 自带的笔记本,这里的目的是能随时随地记录你自己的想法。从本质上讲,就是你需要有一套好用的工具来做你的知识库管理(Knowledge management),也可以说是你知识和思想的外部备份。我个人现在是用 Evernote 同时来做信息采集与笔记的。如果有一个好的流程,你也完全可以用两个工具来分别把这两件事做好。但我建议你花足够多的时间来思考如何组织你的个人知识库。
以上只是两个典型的例子,你需要做的是发现那些你要长期从事的任务(往往不随技术而改变,也不随公司而改变),将完成这些任务所需的工具调整至 最优。再举一个例子,我会留意身边的程序员所用的键盘。只有少部分的程序员会买高端的静电容键盘,比如 HHKB。而在我看来,这明显是一笔很划得来的投资,程序员在工作的大部分时间里都需要和键盘打交道,一个舒适的打字体验是非常有收益的,更何况这类高品 质的键盘都非常的耐用。
开阔你的视野,构建你的技术体系
首先你要给自己设定一个目标,就如同一个公司会设定它的 Vision。
- 目标要够大,这样你才能看到更多的风景。
- 目标应该设定在解决哪一类问题,而不是精通哪一类技术。技术只是手段,不是目的。
例如,“我要成为 iOS developer 中的达人”这个目标,就远不如“我要成为前端应用开发的专家”来得有意义。前者学到深处你可能会去钻研 iOS framework 里各种奇技淫巧,而后者你会开始关注视觉与交互设计,研究各平台间的差异与共同趋势。显然,后者更有助于你的个人发展。
不过即便有了明确的目标,选择哪一类技术学习,如何学习,在信息过载的今天依然是一个难题。常有的观点是应该学习最新的技术,因为老的已经过 时,而反对的观点则是新技术还不成熟。我个人的观点是,当初入一个领域时,选择主流技术框架;当你有一定经验后,选择技术时更应该关注背后的推动者,我相 信优秀的人和团队总能打造优秀的产品,无论是商业公司还是开源社区。不必太在意技术的新旧,因为可能很快都会成为过去时。你真正要学习的是技术背后的思 想。有不少语言与开源项目会写它的 Coding philosophy,这是很意思的,你可以从它们的源代码中去验证这些编程理念。以 Python 为例,如果你执行import this
就会看到它的理念,再如 Python 中一个著名的开源库 Celery,在它的文档有专门一节讲述它的编程理念。 它们对你的影响会比这些技术本身来得更深远,这是我给初学者们的一个忠告。同理,我非常推荐读一些优秀开源库或是语言的源代码,例如 Python 的标准库绝大部分都是用 Python 实现的,而且可读性非常好。如果学习一门技术仅仅停留在用的层面上,你就还没有完全吸取其中的精华,而且学习的收益会随着技术的过时而消失。
我的另一个学习原则是,在选择学习一门新技术时,最大化它与你现有知识库的差异性。读起来可能有拗口,例如你会 Django,接下去你应该去学习 Ruby on Rails 还是 NodeJS? 依据这个原则,你应该学 NodeJS,因为它的异步 IO 模型在理念上与 Django 的同步模型差异很大,而 RoR 则与 Django 更多相似之处。但更好的选择是不要去学另一个 Web framework,去学习 ZeroMQ 或是 Redis,这两者对于 Web development 也非常有帮助,这样就做到了最大化差异。从构建一个程序员的技术理念角度,我会推荐每一个程序至少去了解 Lisp 或是一门 Functional programming language,不管你是否会在可见的未来用到,它们能让你从一个不同的角度看待编程。
最后我建议每个程序员都应该经营一款自己的产品,它可以是一款 app,一个网站或是一个开源软件。除非你是一个创业公司的早期员工,不然你可能没有机会将所有学到的技术或是理念都付之实践,有很多人想成为全栈工程 师,最快的捷径就是打造一款自己的产品。任何一个设计师都会精心打造自己的 Portfolio,但大部分程序员却不会。当评估一个程序员的 Coding 能力时,我会去看他的 Github 上是否有出彩的项目,可惜国内绝大部分程序员的 Github 空空如也,或者只有一些非常简单的程序。我建议大家好好经营自己 Github 上项目,这不但可以提高你的声誉,对你将来的求职也非常有帮助。当你报怨求职面试时又被问到各种无厘头的程序题时,有没有想过面试官也很无奈,因为他没有 任何其他方法得知你的 Coding 能力究竟如何。如果每一个程序员都有自己的作品,我想程序员的面试会简单许多。
重视沟通能力的培养
当被问到“你学得 Junior Developer 和 Senior Developer 最大的差别是什么”时,我最自然的反应是沟通与文档。沟通包括程序员团队内部的沟通,与其他团队的沟通,与 Manager 的沟通等等。我不认为自己有能力把这些问题非常概括地说清楚,不过我可以给一条建议,那就是先学会和你的 Manager 沟通,让他来教你其余的部分。许多公司都会设置 Manager 与组员的1:1,一个有效率的1:1 应该大部分时间有组员来主导。这需要你在1:1 之前花足够多的时间来考虑要问的问题,并且最好提前 1 天发给 Manager,让他有机会思考答案。许多人对此不太重视,或者只问非常具体的问题而不是一些开放性问题,这样你很难在你的 Manager 身上学到东西。如果你渐渐懂得如何利用1:1 的时间,它很会成为你在工作中单位时间投资回报率最高的活动。
累积你的人脉
每个人都明白人脉的重要性,但实际做起来却不容易。参加一些线下的会议或是活动,可能是最直接的扩展人脉的方式之一。可惜大部分人似乎只是去听 了一场技术讲座就回家了。当然,这和不少活动的时间安排也有关系,讲座时间排得太满,茶歇时间短,加上有时嘉宾迟到或是没控制好时间,干脆就把茶歇取消 了。而实际上,结识一两个同道中人远比听技术讲座有价值。下次去参加这类会议,不妨给你自己设个目标,比如至少加两个同行的微信。之后维系你的人脉可能需 要花更多的时间,下了班或是周末找你的朋友们喝个咖啡吧!
另外我觉得每个人都需要一个职场导师,他可以是你第一份工作的导师或是 Manager,也可以是你认识的其他前辈。你们需要维系一个非常长期的关系,不止于一家公司,最好贯穿你的整个职业生涯。每当你遇到疑惑时,都可以询求 他的建议,我觉得这将是你最宝贵的一笔人脉财富。
寻找发挥你才华的平台
最后也是最重要的一步,找到适合你的公司。做为求职者评估一家公司可以看三个方面
- 公司的发展前景(大公司的话,看所在部门的发展前景)
- 你将要加入的团队
- 薪资福利
所以在面试一家公司的时候,你要意识到面试是双向的,公司在面试你的同时,你也在面试这家公司。面试前你应该对这家公司做足功课,准备好一些有质量的问题,比如指出产品中的问题,询问开发流程或是如何做绩效评估。到时你也可以检验一下你的面试官是否合格。
每次选择公司对以上三个方面都应兼顾,但在职业生涯的不同阶段,侧重点不同。比如,在刚刚工作时,加入一个优秀的团队最为重要,他们可以教会你 很多东西,提升你的能力。工作 5 年之后,你需要一个平台施展你的才华,体现个人价值,公司发展前景的重要性迅速提升。当你做出一番成绩,证明了自己的价值之后,逐渐进入收获期,就有了与 公司要价的资格。另一方面,团队实力对公司的前景也有很大的影响。
对一个刚毕业,初入职场的同学,一个近几年被问了无数次的问题“我的第一份工作是去创业公司还是大公司?”我的回答仍旧是“加入一个优秀的团队 最为重要”。一些知名的大公司,团队的素质是有一定保证,但创业公司则不然,团队素质参差不齐,所以如我前面所说你需要面试这个团队,做出自己的判断。不 过除了团队因素之外,我想提一下毕业生去创业公司的几个好处。首先,在刚毕业的一段时间内,经济压力小,是最自由最能承受风险的时期,而这段时间往往不 长,所以应把握好这个去创业公司的黄金时段。其次,所有的学生进入大公司后,都会担任初级职位,某种程度上来讲是学校学习的延续,规范有条理,但缺乏独立 性和创新性,而这正是中国大部分学生所欠缺的。这方面的能力在一家创业公司可以得到快速锻炼,而在大公司可能要等升到中级职位后才有这方面的机会。个人观 点,仅供参考。
小结
我觉得步入职场的前 3 年对今后的发展尤其重要,希望此文能对年轻的程序员们有所帮助。欢迎评论!
相关推荐
内容概要:本文详细介绍了永磁同步电机(PMSM)三闭环控制系统的仿真建模方法及其参数优化技巧。首先阐述了三闭环控制的整体架构,即位置环、速度环和电流环的层级关系,并解释了每个环节的作用。接着展示了各环的具体实现代码,如电流环的PI控制器、速度环的前馈控制以及位置环的限幅处理。文中强调了调参的重要性和注意事项,提供了具体的参数选择依据和调试建议。最后分享了一些实用的仿真技巧,如死区补偿、故障注入等,确保模型能够应对实际工况。 适合人群:从事电机控制研究的技术人员、研究生及以上水平的学生,特别是对永磁同步电机三闭环控制感兴趣的读者。 使用场景及目标:适用于需要深入了解PMSM三闭环控制原理并进行仿真实验的研究人员和技术开发者。目标是帮助读者掌握如何构建高效的三闭环控制系统,提高电机性能,降低能耗,增强系统的鲁棒性和可靠性。 其他说明:文中提供的代码片段和参数配置均基于MATLAB/Simulink平台,建议读者在实践中结合实际情况调整参数,以获得最佳效果。同时,附带的参考资料也为进一步学习提供了指导。
光电材料仿真,电子仿真等;从入门到精通教程;含代码案例解析。
内容概要:本文详细介绍了利用PFC3D5.0进行滑坡致灾与建筑物易损性分析的完整代码实现。首先,通过Python和Fish语言构建了滑坡体和建筑物的模型,设置了关键参数如密度、刚度、摩擦系数等,确保滑坡体能够真实模拟滑坡行为。其次,针对建筑物的不同部位(楼板、墙体、支柱),采用不同的材料特性进行建模,并加入了实时监测系统,用于记录滑坡过程中各部件的应力、应变以及冲击力的变化情况。此外,还实现了冲击力监测、损伤评估等功能,能够自动触发应急分析并在模拟结束后生成详细的损伤报告。最后,通过对多次模拟结果的数据处理,生成了建筑物的易损性曲线,验证了模型的有效性和准确性。 适合人群:从事地质灾害研究、土木工程、结构安全评估的研究人员和技术人员。 使用场景及目标:适用于滑坡灾害预测、建筑设计优化、抗震防灾等领域。通过模拟不同条件下滑坡对建筑物的影响,帮助研究人员更好地理解滑坡致灾机理,为制定有效的防护措施提供科学依据。 其他说明:文中提供了大量实用的小技巧,如调整参数以获得更好的模拟效果、优化计算效率等。同时强调了模型验证的重要性,确保研究成果具有较高的可信度。
编译httpserver 通过后记录的
光电材料仿真,电子仿真等;从入门到精通教程;含代码案例解析。
内容概要:本文详细探讨了在Android平台上进行图像模板匹配的技术挑战和解决方案,特别是在处理不同尺寸和旋转角度的目标物时的方法。文中介绍了使用OpenCV构建图像金字塔、处理旋转模板以及利用NEON指令集优化性能的具体实现。此外,文章还讨论了在armeabi-v7a和arm64-v8a这两种主要ARM架构下的优化技巧,如内存对齐、SIMD指令优化、RenderScript并行处理等。作者分享了许多实践经验,包括如何避免常见的性能瓶颈和兼容性问题。 适合人群:有一定Android开发经验,尤其是熟悉OpenCV和NDK编程的中级及以上开发者。 使用场景及目标:适用于需要在移动设备上进行高效图像识别的应用开发,如实时视频流中的物体检测、游戏内的道具识别等。目标是提高模板匹配的速度和准确性,同时确保在不同硬件配置下的稳定性和兼容性。 其他说明:文章提供了丰富的代码片段和实际案例,帮助读者更好地理解和应用所介绍的技术。特别强调了在不同ARM架构下的优化策略,为开发者提供了宝贵的参考资料。
光电材料仿真,电子仿真等;从入门到精通教程;含代码案例解析。
内容概要:本文详细介绍了利用COMSOL软件模拟电晕放电离子风的过程。首先解释了电晕放电的基本概念,即在高压电场下电极周围空气被电离形成离子风。接着阐述了如何在COMSOL中建立针-板电极结构的三维模型,涉及静电、层流和稀物质传递三个物理场的设置。文中提供了具体的MATLAB代码片段用于初始化模型、定义几何体、设置边界条件、配置物理参数、进行网格划分以及求解模型。此外,还讨论了求解过程中可能出现的问题及解决方法,如收敛技巧、网格划分策略等。最后强调了通过模拟获得的电场分布、气流速度和离子浓度等结果对于理解和优化电晕放电离子风设备的重要性。 适用人群:对电晕放电现象感兴趣的科研人员和技术开发者,尤其是那些希望深入了解多物理场耦合仿真技术的人群。 使用场景及目标:适用于需要研究电晕放电离子风特性的场合,如空气净化装置、散热设备等领域的产品设计与性能评估。目标是帮助用户掌握如何使用COMSOL软件构建并求解电晕放电离子风模型,从而更好地理解相关物理机制。 其他说明:文中提到的实际操作细节和遇到的技术挑战有助于新手避免常见错误,提高建模效率。同时,提供的具体参数设置和代码示例也为进一步深入研究奠定了基础。
内容概要:本文详细介绍了多模态属性级情感分析的技术原理及其应用场景。首先解释了多模态属性级情感分析的意义,即通过结合文本和图像信息来更全面地理解用户情感。接着阐述了数据预处理方法,如使用BERT进行文本编码和ResNet处理图像。然后深入探讨了模型架构,包括双流网络结构和特征融合策略,以及如何通过跨模态注意力机制实现更好的特征对齐。此外,文中还分享了多个实战案例,如电商广告投放系统中如何利用该技术提高转化率,以及在处理用户评价时遇到的问题和解决办法。最后讨论了一些常见的技术挑战,如模态间权重调整、背景干扰物处理等。 适合人群:从事自然语言处理、计算机视觉研究的专业人士,尤其是希望将这两种技术结合起来进行情感分析的研究者和技术开发者。 使用场景及目标:适用于电商平台、社交媒体平台等需要分析用户反馈的场景,旨在帮助企业更好地理解消费者的真实想法,从而优化产品和服务。通过这种方式,企业可以发现潜在的市场机会并改进营销策略。 其他说明:文章不仅提供了理论指导,还包括具体的代码实现示例,有助于读者快速上手实践。同时强调了实际应用中的注意事项,如数据清洗、模型调优等方面的经验教训。
内容概要:本文详细介绍了5MW海上永磁风电直驱系统的Simulink仿真过程,涵盖矢量控制、混合储能系统以及并网逆变器的设计与调试。首先,文章解释了系统架构,包括永磁电机、两电平并网变流器和混合储能模块。接着,深入探讨了矢量控制中的坐标变换、PI参数设置及其对电网波动的影响。对于混合储能系统,文章讨论了滑动平均滤波用于功率分配的方法,确保超级电容和锂电池的有效协同工作。此外,文章还涉及并网逆变器的控制策略,特别是变参数PI控制和死区时间补偿,以应对复杂的电网环境。最后,通过仿真结果展示了系统的高效性和稳定性。 适合人群:从事电力电子工程、风电系统设计与仿真的工程师和技术研究人员。 使用场景及目标:适用于希望深入了解海上风电系统仿真技术的专业人士,旨在提高对矢量控制、混合储能和并网逆变器的理解,从而优化实际应用中的系统性能。 其他说明:文中提供了多个MATLAB代码片段,帮助读者更好地理解和复现相关控制算法。同时,强调了仿真过程中遇到的实际问题及解决方案,如风速突变、电网电压跌落等情况下的系统响应。
光电材料仿真,电子仿真等;从入门到精通教程;含代码案例解析。
该资源为natsort-5.4.0-py2.py3-none-any.whl,欢迎下载使用哦!
内容概要:本文详细介绍了双馈风力发电机(DFIG)的矢量控制仿真模型,特别是定子侧和转子侧的控制策略。定子侧采用电压定向矢量控制,通过双闭环结构(外环控制直流侧电压,内环控制电流),确保功率因数为1。转子侧采用磁链定向矢量控制,同样基于双闭环结构(外环控制功率,内环控制电流),并引入前馈电压补偿提高响应速度。文中提供了具体的PI控制器代码实现,并讨论了仿真模型的搭建方法,如使用Python的scipy库进行动态响应模拟。此外,文章还提到了一些常见的仿真问题及解决方案,如crowbar保护电路、最大功率跟踪算法和低电压穿越模块等。 适合人群:从事风电系统设计、控制算法开发的研究人员和技术人员,以及对电力电子控制系统感兴趣的工程师。 使用场景及目标:适用于希望深入了解DFIG矢量控制原理和实现细节的专业人士,帮助他们掌握定子侧和转子侧的具体控制策略,优化仿真模型,解决实际工程中的问题。 其他说明:文章不仅提供了理论分析,还包括了大量的代码片段和实践经验,有助于读者更好地理解和应用相关技术。
内容概要:本文详细介绍了利用Python进行煤矿瓦斯气驱过程中二氧化碳和氮气的应用方法和技术细节。首先展示了如何通过Python脚本处理气驱压力监测数据并绘制对比图,接着讲解了注气速率控制的PID算法实现及其注意事项。文中还涉及裂隙气体扩散模拟、湿度对氮气驱替的影响以及基于状态机的注气控制系统设计。此外,提供了实时气体浓度监控、数据滤波、阈值报警等功能的具体实现方式,并强调了数据可视化的应用价值。最后讨论了注气孔布置优化和注气压力控制的实际操作要点。 适合人群:从事煤矿开采及相关领域的技术人员、工程师,尤其是具有一定编程基础并对自动化控制感兴趣的从业者。 使用场景及目标:适用于煤矿瓦斯气驱项目的规划、实施与维护阶段,旨在提高瓦斯抽采效率,确保安全生产,同时减少人为因素导致的操作失误。通过学习本文提供的代码示例和技术方案,读者能够掌握如何运用Python解决实际工程问题的方法。 其他说明:文中提到的所有代码均为简化版本,用于解释相关概念和技术原理,在实际项目中可能需要进一步完善和优化。对于希望深入了解该领域的读者而言,本文不仅提供了实用的技术指导,也为后续研究奠定了良好的基础。
光电材料仿真,电子仿真等;从入门到精通教程;含代码案例解析。
街道级行政区划边界,wgs84坐标系,shp数据,直接分析使用。
字节码.md
Maven.md
内容概要:本文详细介绍了如何使用带有外源输入的非线性自回归网络(NARX)进行多变量时间序列预测,并提供了完整的Matlab代码实现。文章首先解释了NARX的基本概念,强调其能够同时考虑时间序列自身的历史值和其他相关变量(如政策变量)。接着逐步展示了从数据准备、创建NARX网络、训练网络到最后的预测与评估的具体步骤。文中还讨论了一些常见的挑战,如数据预处理、参数选择和模型优化技巧。此外,通过具体的例子演示了NARX在网络结构配置、训练方法选择等方面的应用细节。 适合人群:对时间序列预测感兴趣的研究人员和技术开发者,尤其是有一定Matlab基础并希望通过实例加深对NARX网络理解的人群。 使用场景及目标:适用于需要处理多变量时间序列预测任务的实际工程项目,如经济预测、电力系统负荷预测、空气质量预测等领域。目的是帮助读者掌握NARX网络的工作原理及其在不同应用场景下的具体实现方法。 其他说明:文章不仅提供理论指导,还包括大量实用的操作指南和代码片段,有助于读者快速上手实践。同时指出NARX虽然有效但对于长期依赖问题不如LSTM,但在特定条件下仍然是工业界的优选方案。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。