经验:如何提升你的能力?给年轻程序员的几条建议
优采云 发布时间: 2022-10-16 23:15经验:如何提升你的能力?给年轻程序员的几条建议
一转眼,我已经工作了8年。前两天刚进入职场的一位同事请我给我一些建议和经验。我觉得这个话题很有价值。我根据我个人的想法和经历写这篇文章,希望能给年轻的开发者一些启发。
我曾在 4 家公司工作过,NVIDIA、Google、Slide 和 Glow。其中两家是知名的大公司。Slide I 在 D 轮之后加入,当时大约有 150 人。Glow 从第一天开始就一直存在,直到现在。个人工作还包括开发人员、技术主管、工程经理和首席技术官。这些经历让我对一个程序员的个人发展道路有了更全面的认识。
如果你问一个年轻的前端开发者,未来 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 的一种方言。我认为学习lisp可以提高程序员对编程核心思想的理解。另一个加分点是,Emacs 以其高门槛和 lisp 的特点,吸引了大批高素质的程序员。对比Vim,Vim的精髓在于Mode编辑,值得学习,可以大大提高文本编辑的效率。
但是当你熟悉了这个概念后,我认为你可以切换到其他编辑器,因为 Vim 的架构和 Vimscript 限制了它的可扩展性。Emacs 完全支持通过 Evil 插件进行 Mode 编辑,其他主流编辑器也有类似的插件,所以一旦掌握了这个概念,它也可以在其他编辑器中发挥作用。有人可能会说,没有一个 Vim 模拟器可以做到 100% 的 Vim 的功能,但重点不是某个命令是否移植,而是模式编辑思想的精髓能否移植。我认为答案是肯定的。
看Atom vs Sublime,Atom的扩展性非常好,大部分核心功能都是以插件的形式实现的,和Emacs差不多。而且它的开源性质让我相信它比 Sublime 具有更持久的生命力。
我对 IDE 的看法是,我不排除 IDE,但每个 IDE 都服务于特定的任务或编程语言。作为一个有抱负的程序员,您可以使用 IDE,但您仍然需要精通功能强大的通用编辑器。
与编辑器类似,高效的开发环境还包括Shell、Launcher、窗口管理器、文档阅读器等。其中一些可以在很短的时间内完成配置,并且它们的投资回报率非常高。
信息采集器 和笔记本
前者用于采集他人产生的信息,后者用于采集自己产生的信息。前者的一个简单示例是浏览器的书签。您需要能够随时存档一组有用的信息,并在将来的某个时间点快速找到它。后者最直观的例子是Mac OS或iOS自带的笔记本,目的是随时随地记录自己的想法。本质上,你需要一套对你的知识管理(Knowledge management)有用的工具,也可以说是你的知识和想法的外部备份。就个人而言,我现在将 Evernote 用于信息采集 和笔记。如果你有一个好的流程,你也可以使用两个工具分别做这两件事。
以上只是两个典型的例子。您需要做的是找到那些您将长期从事的任务(通常不会随着技术或公司而改变),并调整所需的工具以将它们完成到最佳状态。再举一个例子,我注意周围程序员的键盘。只有少数程序员会购买高端的静电电容键盘,比如HHKB。在我看来,这显然是一项值得的投资。程序员的大部分工作都需要处理键盘。舒适的打字体验是非常有利可图的,何况如此高品质的键盘。非常耐用。
拓宽视野,构建技术体系
首先,你必须为自己设定一个目标,就像一个公司会设定它的愿景一样。
例如,“我想成为一名 iOS 开发者”的目标远没有“我想成为一名前端应用程序开发专家”的意义。前者你可能会深入研究iOS框架中的各种花样和技巧,而后者你会开始关注视觉和交互设计,研究平台之间的差异和共同趋势。显然,后者更有利于你的个人发展。
然而,即使有了明确的目标,在信息过载的今天,选择学习哪种技术,如何学习,仍然是一个难题。经常有一种观点认为应该学习最新的技术,因为旧的已经过时了,而反对的观点是新技术不成熟。我个人的观点是,第一次进入一个领域,选择主流的技术框架;当你有一定的经验时,在选择技术时更应该关注背后的推动者。我相信优秀的人和团队总能创造出优秀的产品,无论是商业公司还是开源社区。不要太担心技术的新旧程度,因为它可能很快就会成为过去。
有很多语言和开源项目都会写他们的 Coding 哲学,这很有趣,你可以从他们的源代码中验证这些编程概念。以 Python 为例。如果你执行 import this,你会看到它的概念。另一个例子是 Celery,它是 Python 中著名的开源库。它的文档中有一个特殊的部分来描述它的编程概念。它们对你的影响比技术本身更大,所以这是我对初学者的建议。同样,我强烈推荐阅读一些优秀的开源库或语言的源代码。比如Python的大部分标准库都是用Python实现的,可读性非常好。如果学习一门技术只是停留在使用层面,你还没有完全吸收它的精髓,
我的另一个学习原则是,在选择学习新技术时,要最大限度地区别于你现有的知识库。可能很难阅读。例如,如果您了解 Django,您应该学习 Ruby on Rails 还是 NodeJS?根据这个原则,你应该学习NodeJS,因为它的异步IO模型在概念上与Django的同步模型不同。而且 RoR 更类似于 Django。但是更好的选择是不要学别的web框架,学ZeroMQ或者Redis,这两者对web开发也很有帮助,这样才能最大限度的发挥差异。从构建程序员的技术角度来看,我建议每个程序至少了解 Lisp 或函数式编程语言,无论您是否会在可预见的将来使用它,
最后我建议每个程序员都应该运行自己的产品,它可以是一个应用程序,一个 网站 或一个开源软件。除非您是初创公司的早期员工,否则您可能没有机会将您学到的所有技术或想法付诸实践。想成为全栈工程师的人很多,而最快的捷径就是打造自己的产品。任何设计师都会精心设计自己的作品集,但大多数程序员不会。
在评估一个程序员的 Coding 能力时,我会看他的 Github 上是否有优秀的项目。可惜国内大部分程序员的Github都是空的,或者说只有一些很简单的程序。我建议大家在 Github 上运行自己的项目,这不仅可以提高你的声誉,而且对你以后的求职也很有帮助。当你抱怨在求职面试中被问到各种无厘头的程序性问题时,你有没有想过,面试官也很无奈,因为他没有其他办法知道你的编码能力?如果每个程序员都有自己的工作,我想程序员的面试会容易很多。
重视沟通技巧的发展
当被问到“初级开发人员和高级开发人员之间最大的区别是什么”时,我最自然的回答是沟通和文档。沟通包括程序员团队内部的沟通、与其他团队的沟通、与经理的沟通等等。我不认为我有能力把这些问题说得很笼统,但我可以给出的一条建议是先学会和你的经理谈谈,然后让他教你剩下的。许多公司会在经理和团队成员之间设置 1:1 的比例。大多数时候,高效的 1:1 应该由团队成员主导。这需要你在1:1之前花足够的时间思考要问的问题,最好提前1天发给经理,让他有机会思考答案。很多人不认真对待,或者问一些非常具体的问题而不是一些开放式的问题,这让你很难向你的经理学习。如果您了解如何使用 1:1 时间,它可能会成为您在工作中每小时最高的 ROI 活动。
积累你的网络
每个人都知道网络的重要性,但实际上做到这一点并不容易。参加一些线下的会议或活动可能是拓展人脉最直接的方式之一。太糟糕了,大多数人似乎只是在技术演讲后回家。当然,这也与很多赛事的日程安排有关。讲课时间太满,茶歇时间短,有时客人迟到或没有时间控制,茶歇就干脆取消了。事实上,结识一两个志同道合的人远比听技术讲座更有价值。下次去这样的会议,不妨给自己定个目标,比如至少加两个微信同行。下班后可能需要更多时间来保持联系,所以下班后或周末与朋友一起喝杯咖啡吧!
此外,我认为每个人都需要职业导师。他可以是你第一份工作的导师或经理,也可以是你认识的其他前辈。你需要保持一种非常长期的关系,不仅是与一家公司,而且最好是在你的整个职业生涯中。当你有疑问时,你可以向他寻求建议。我认为这将是您最有价值的网络资产。
找个平台施展才华
最后也是最重要的一步是为您找到合适的公司。评估公司作为求职者的三种方法:
所以在去公司面试的时候,你要意识到面试是双向的,公司在面试你的同时,你也在面试公司。面试前要做好公司的功课,准备质量问题,比如指出产品存在的问题,询问开发过程或者如何做绩效考核。然后你也可以检查你的面试官是否合格。
每次选择公司,都应该考虑到以上三个方面,但是在职业生涯的不同阶段,侧重点是不同的。比如你刚工作的时候,加入一个好的团队是最重要的,他们可以教会你很多东西,提高你的能力。工作5年后,你需要一个施展才华、体现个人价值的平台。公司发展前景的重要性正在迅速增加。当你取得了一些成绩,证明了自己的价值,逐渐进入收获期,你才有资格向公司索要价格。另一方面,团队实力对公司的前景也有很大的影响。
对一个刚毕业刚进入职场的同学,这几年被问过无数次的问题,“我的第一份工作是去创业公司还是大公司?” 我的回答仍然是“最好的办法是加入一个优秀的团队。很重要”。在一些知名的大公司,团队的素质是有一定保证的,但是创业公司就没有,而且团队的素质参差不齐,所以我前面说了,需要面试团队,自己做判断。但除了团队因素,我想提一些毕业生去创业的好处。
首先,毕业后的这段时间,经济压力不大,是最自由、最能承受风险的时期,而且这个时期往往不长,所以要把握好这个黄金时间去创业公司。其次,所有学生进入大公司后都会担任初级职位,这在一定程度上是学校学习的延续。他们组织良好,但缺乏独立性和创新性,这是中国大多数学生所缺乏的。这种能力在初创公司可以快速锻炼,而在大公司可能要等到晋升到中层才有机会。个人观点,仅供参考。
概括
我觉得进入职场的前3年对于以后的发展尤为重要,希望这篇文章能够对年轻的程序员有所帮助。
优化的解决方案:如何利用 Apache APISX 提升 Nginx 的可观测性
1.1.2 VTS 模块
VTS 模块有三个明显的缺点。
一、安装复杂
VTS模块虽然可以采集指标,而采集指标类型很多,但是安装比较复杂。如果要使用VTS模块,需要重新编译Nginx,在编译Nginx前添加VTS模块,编译后重新安装Nginx才能正常使用VTS。
2、拓展能力弱
VTS扩展能力分为两部分,一是在编译前对VTS添加扩展;另一种是编译后添加扩展——修改nginx.conf配置文件。通过修改 nginx.conf 文件添加扩展会导致 Nginx 重载,在生产环境中直接重载或多或少会影响业务。
3.社区更新慢
VTS模块最近一次更新是在2018年,已经暂停了3年。
1.1.3 Nginx 放大SaaS
Nginx Amplify 是一项 SaaS 服务。Nginx Amplify 在远端提供服务,并在 Nginx 服务之外安装 Agent。
如果 采集 模块安装在 Nginx 之外,则会对 采集 指标有限制,只能获取 Nginx 公开的信息,无法获取未公开的内部信息。
另外,这是一个SaaS服务,采集接收到的数据需要通过公网传输到服务器,这会带来一些安全隐患,也会屏蔽一些企业用户的外部访问。也许 Nginx Amplify 的目标群体是像 Nginx plus 这样的企业用户,而不是开源用户。
Nginx Amplify SaaS 社区也不活跃,已经关闭了 2 年。
1.2 Nginx自身事件的缺陷
Nginx 在事件采集方面有自己的不足。这里有两个问题:
1.基于nginx.conf配置Nginx。修改后重新加载nginx.conf文件即可使配置生效。除了reload事件,没有其他事件可用,我们无法知道每个修改文件的变化。比如一开始只配置了一条路由,修改后的文件中增加了十条路由。只有 reload 事件无法知道添加了哪十个路由。路线。
其次,Nginx 开源产品缺乏主动健康检查。Nginx 是反向代理,真正的后端服务可能会重启、升级或异常。如果没有主动健康检查,依靠被动检查,只有当流量异常时,才会知道服务有问题。这样会丢掉很多Events,导致上游Events事件信息不完整。
1.3 Nginx可观测性总结
Nginx 的开源版本并没有提供非常有用的监控。虽然 Nginx 提供了一些监控工具,但是这些工具的安装和配置非常复杂,扩展性很小。也许这些工具不是为可观察性而设计的,而只是为了能够查看指标或统计数据以帮助定位问题。有多种可观察性设置产品可用,但它们很难与 Nginx 集成。
此外,Nginx 社区停滞不前,导致 Nginx 迭代缓慢。
2. Apache APISIX 概述
2.1 Apache APISIX 与 Nginx 的关系
Apache APISIX 是基于 Nginx 实现的,但只依赖于 Nginx 的网络库。Apache APISIX 在 Nginx 的基础上实现了自己的核心代码,并预留了扩展机制。
Apache APISIX 与 Nginx 的功能对比见下表。Apache APISIX既可以做反向代理,也可以做Nginx不支持的功能,比如主动健康检查、流量管理、水平伸缩等,而且这些功能都是开源的。
Apache APISIX 架构图
2.2 Apache APISIX 简介
Apache APISIX是一个动态、实时、高性能的API网关,提供负载均衡、动态上游、灰度发布、服务中断、身份认证、可观察性等丰富的流量管理功能。Apache APISIX 也是世界上最活跃的开源 API 网关项目,一个生产就绪的高性能网关。全球数百家公司使用Apache APISIX处理关键业务流量,涵盖金融、互联网、制造、零售、运营商等,如NASA、欧盟数字工厂、中航信、中国移动、腾讯、华为、微博、网易、优采云找房、360、泰康等
2.3 Apache APISIX 解决方案
左边,从上到下是从单体服务到 SOA(面向服务的架构)再到微服务的演进。
SOA下,网关一般使用Nginx或HAProxy;在微服务架构下,网关使用 Nginx 进行负载均衡。微服务架构常见的解决方案有两种:一种是基于Java技术栈实现,如Spring Cloud系列;另一个是服务网格。在这个演进过程中,Apache APISIX 在哪里,能做什么?简单来说,左图中的红色部分(Nginx / HAProxy / Kong / Spring Cloud Zuul / Spring Cloud Gateway / Traefik / Envoy / Ingress Nginx)都是可以用Apache APISIX替代的解决方案。
SOA下有Apache APISIX SLB解决方案,微服务架构下有Apache APISIX Gateway,Kubernetes部署Apache APISIX Ingress,Service Mesh部署Apache APISIX Mesh。
从业务请求流量来看,客户端发起请求时,会经过LB,再通过Gateway,将请求分发给后端业务服务。红色部分(LB / Gateway / Spring Cloud Gateway / K8s Ingress / Sidecar)都可以选择Apache APISIX作为解决方案。Apache APISIX支持插件的多语言开发,可以在Java系统下用Java编写。
Apache APISIX 是全流量的数据平面。Apache APISIX 对 LB、Gateway、Ingress 和 Sidecar 都有相应的解决方案。就可观察性而言,它们是统一的解决方案和统一的解决方案。当解决方案统一时,管理控制链也很容易实现。
3. Apache APISIX 的可观察性
Apache APISIX 可以用可观察性做什么?Apache APISIX 可观察性的优势是什么?
3.1 Apache APISIX 采集 支持的数据类型
Apache APISIX 支持 采集 数据类型:
追踪 - 整合 SkyWalking
指标 - 集成 SkyWalking / Prometheus
记录 - 与 SkyWalking / 其他记录平台集成
Apache APISIX 是可以替代 Nginx 或其他网关的网关产品;在可观察性方面,Apache APISIX 可以集成多个 APM 或可观察性系统,例如:Tracing 部分可以集成 SkyWalking,Prometheus 可以集成 SkyWalking 或 Metrics 指标,Logging 可以集成 SkyWalking 等一些日志系统。
3.2 Apache APISIX 在可观察性方面的优势
3.2.1 高扩展性
Apache APISIX 可以通过插件扩展自己的能力。上面提到的三种数据类型都是通过插件机制实现的。
为什么 Apache APISIX 具有可扩展性?因为 Apache APISIX 支持自定义插件。Apache APISIX 支持用多种语言编写插件。默认语言是Lua,插件也可以用Java、Golang等编程语言编写。
3.2.2 灵活的配置能力
举三个例子介绍Apache APISIX的灵活配置能力。第一个例子是 Apache APISIX 可以在运行时修改日志配置,例如添加/修改日志字段。修改日志字段是一个比较常见的需求。比如业务刚上线的时候,就配置了日志字段。系统运行一段时间后,需要修改或增加几个日志字段。如果使用 Nginx,修改 nginx.conf 文件使其符合要求,重新加载使配置生效。Apache APISIX 只需要通过脚本配置字段,动态生效。
灵活配置能力的第二个例子是使用 Prometheus。在 Apache APISIX 中,如果要创建/删除一个指标或扩展指标标签,只需要在 Prometheus 插件中添加一个 metarcs 或填写相关信息即可。Apache APISIX 有热重载机制,无需重启即可直接生效。
第三种灵活的配置能力体现在 Apache APISIX 的实现中。Apache APISIX 管理所有的路由对象,并在内存中有一套对象管理机制。在 Apache APISIX 中为 API 添加插件,可以将有效级别细化到 API,每个 API 可以绑定一个插件,也可以从 API 中移除插件。Apache APISIX 可以精细控制每个服务中每个 API 的可观察性数据采集。也就是说,你只能采集你最关心的数据,而这些配置是动态的,可以随时调整。
3.2.3 活跃社区
Apache APISIX 最重要的优势之一是它拥有一个活跃的社区。一个活跃的社区可以让产品快速迭代,越来越完善,从而满足大家的需求。
上图展示了 Apache APISIX(绿色)、Kong(浅蓝色)、mosn(*敏*感*词*)和 bfe(深蓝色)贡献者的增长曲线。Apache APISX 的增长趋势最快,曲线也最陡峭。Apache APISIX 社区活动是同类项目中最为活跃的。
4.结合Apache SkyWalking,进一步提高可观测性
将 Apache APISIX 与 Apache SkyWalking 结合可以做出哪些改进?除了 SkyWalking Tracing 插件外,还可以将 Tracing、Metrics、Logging 和 Event 聚合到 SkyWalking 中,借助 SkyWalking 的聚合能力可以链接数据。
4.1 SkyWalking 卫星
SkyWalking Satellite由Apache APISIX社区、Apache SkyWalking社区和百度深度合作开发。
SkyWalking Satellite 根据上述采集data的步骤,SkyWalking Satellite可以部署在更靠近前端产生数据的地方,以sidecar的形式。图中,自上而下的业务请求通过 Apache APISIX 代理到 Upsteam。Satellite 以 Sidecar 的形式部署在 Apache APISIX 旁边,采集 Apache APISIX、tracing、metrics、logging 三种数据类型的数据,通过 GRPC 协议发送给 Apache APISIX。空中漫步。最重要的一点是:在本次部署中,Apache APISIX 可以直接将这三种数据类型集成到 SkyWalking 中,无需任何改动。
4.2 ALS 解决方案
ALS(Access Log Service)通过Apache APISIX发送访问日志,在普通访问日志中添加特殊字段,如添加关键字段,方便生成拓扑图和聚合指标。
ALS解决方案最大的优势在于可以直接分析聚合拓扑图、指标、通过访问日志记录三种类型的数据。
在使用 Prometheus 时,如果配置了 URI 级别的 metrics 指标统计,整个metrics 会迅速膨胀。因为URI级别可能有几十个服务,每个metric后面可能有很多标签,这会降低网关性能,增加获取metric的难度。使用ALS方案,数据通过流式发送到SkyWalking,计算交给SkyWalking,也方便后续查询,不会出现每隔几秒就拉取非常大量数据的情况。
4.3 将事件集成到 SkyWalking
常用的Events包括:配置分发、集群变更、健康检查。
配置分发:配置API分发时,可能会添加/修改/删除路由,可能会添加插件。
集群变化:当集群发生变化时,需要知道集群中的服务数量。比如扩容时IP会发生变化,而变化在网关收到报文时体现出来。每个进程都是一个事件,这些事件需要暴露。
健康检查:主动检测是否健康。比如业务请求的失败率突然增加,事件检测到业务服务不健康。这时候可以快速定位问题。