“AI 技术+人才”如何成为企业增长新引擎?戳此了解>>> 了解详情
写点什么

如何成为优秀的全栈工程师?面向未来的跨界开发技术 (下)

  • 2019-10-29
  • 本文字数:4410 字

    阅读完需:约 14 分钟

如何成为优秀的全栈工程师?面向未来的跨界开发技术(下)

在上一篇文章中,我们定义了“未来”的时间段,也描述了如何“面向未来”去学习。简单的总结下,没有实践场景,学不到真正的技术。如果不动手去做,读再多书也不会学到新技术。


在本文中,我们继续聊聊如何“跨界开发”。


我在腾讯的社交用户体验设计部工作,在这不长不短的 6 年多工作经验中,跟很多设计师打交道,也跟很多工程师打交道。我学到的一个宝贵知识是,设计不等于艺术,工程不等于科研。


设计不等于艺术。用文艺的话说就是“艺术发现问题,设计解决问题”。也即是说,设计为商业服务。作为上市公司的设计部门,需要清晰地展现产品,构建用户的渴望。在某种程度上,需要隐藏个人的“术”,而构建一个系统性的体验给用户。设计的创作虽然也依赖灵感,但整体上是科学的、可推导的。


工程不等于科研。科研需要在一个专精的技术点上达到一百分,甚至突破人类知识的最外层,达到 101 分。但是在工程的场景下,更重要的是投入恰到好处的技能点去实现现阶段的目标。


因此,当我想要独自创建一个自己的产品的时候,我自然而然在设计、前端、后端、APP 客户端等都投入了恰到好处的技能点。


再强调一下,我并不是想要做全栈工程师,所以学了这些技能,而是因为想要独自做一些产品,在这个过程中,持续学习,不自觉领悟到了全栈工程师的一些心法。


我把这些心法都记录在我的新书《Web 全栈工程师的自我修养》中。



我有一个假说,那就是“好的前端工程师一定是好的全栈工程师,反之不一定”。


因为没有数据证明,所以我必须老实承认,这只是我个人的一个假说。



以下是我的推导过程。


首先,如果我们都同意全栈工程师的定义是“能够独自完成一个产品的人”(而不是“精通一切技术的人”)。那么一般的 Web 产品或者 App 产品会需要的能力,大体上分为“技术”、“学习”和“产品感”三个方面。


技术是实现一个产品需要的“工程能力”,包括下图列出的前后端语言,数据结构和算法,系统设计能力,数据库,移动客户端。


学习体现了持续学习和解决新问题的能力。除了图中列出的技术,还有持续增长中的新技术,所以有效的学习能力必不可少。


产品感包括对用户体验的理解,以及根据产品数据来持续迭代产品的能力。为什么产品感很重要?App Store 有一些优秀的 App,是由个人开发者独立开发的,他们完成了从构思到设计、从开发到发布的整个过程。如果没有良好的产品感,是无法实现从“程序员”到“工程师”的转变的。



前端工程师在学习和产品感上都有天然的优势。


因为国内即使是最优秀的大学,也没有“前端”这门专业。vue.js 的作者 Evan 本科学的是艺术史,Node 大神 TJ 是学设计,都不是计算机专业。最终进入到前端领域,靠的是爱好、勤奋和学习能力。所以我想“前端工程师学习能力强”这一点应该没有人能反驳。


在产品感上,因为前端经常跟用户界面打交道,所以在工作中就会思考怎样的用户界面会吸引用户。用户可能使用多种多样的浏览器和设备访问网站,因此也需要同理心来感受用户的实际访问情况。再次强调,“没有实践场景,就不会有阵子的成长”,前端会在“产品感”上有更多实践场景。


当然,不是所有的前端都有这样的想法,但是对于走心的前端来说,提升整体能力的机会有很多很多。



对于前端工程师而言,比较熟练的自然是前端技术(HTML/CSS/JavaScript),而熟练使用前端技术的前提,就是对系统有所理解。


系统设计是指使用软件工程的方式架构一个软件系统,能够对应解决现实生活中的实际问题。我的感觉是,在软件系统中经常会用到 HTTP 协议,来进行客户端和服务器端的通信,甚至服务器和服务器之间的通信。对于必须掌握 HTTP 的前端工程师来说,往往已经有大概的了解。


说到后端,语言其实并不构成很高的技术门槛。在服务器端,如果不是用户量特别大的系统,数据量都可以通过一台服务器来处理完成的话,前端工程师也经常会跟后台 API 和简单的模板型语言打交道。


只要投入时间,应用层的后端语言很快就能上手,你需要的只是一个使用后端语言的机会。



在学习后端语言时,我的建议是,专注项目,精简需要的技能列表。


也就是说,如果你已经精通 JavaScript,就直接使用 Node 开始搭建后端吧,不要去学 PHP 或 Java 了。除了增加复杂度,并没有太大意义。


人类的大脑并不是为了处理复杂项目而设计。人类从原始村落进步到现代化都市,不是因为发生了基因或生理上的进化,而是协作方式发生了改变(分解复杂项目,每人都遵循共同接口,只完成分解后的工作)。所以全栈工程师在学习技能时也应认识到自己大脑的极限。


当然,如果团队对后端语言有要求,那必须遵循团队已有的技术能力。


总之,不要在某一特定时间同时学习多门语言,除了增加技术复杂度,没有任何意义。



说到 Node,推荐一个网站。它是《软件随想录》作者 Joel 最新的革命性产品,能够让开发者以最快方式开发 Node 程序,而无需购买服务器和搭建开发环境。


如图,在 package.json 的 dependencies 里加入新的依赖库名称和版本号,保存,服务器会自动下载好对应的库到你的 node_modules 目录中。



还提供库名补全功能。



接下来你就可以直接在代码中使用这个库了,因为这个库已经安装在云端的“本地了”,太方便了!



说说移动客户端开发吧,具体而言是指 iOS 和 Android 客户端。


客户端原生开发与前端开发的相似之处是,本质上都只对数据进渲染,生成用户界面,以及对用户行为做出响应。从 2015 年开始,客户端开发和前端开发有越来越多的相似点,比如使用 MVC 的架构方式来把界面、逻辑和数据分开,比如都可以用 React 技术栈来实现。



当前端工程师接触到客户端原生开发,绝对会有一种“打开新天地”的感觉!原本依赖客户端提供的设备接口,现在全都可以通过原生接口直接操作;原本超过几千行就崩溃的图文表单,使用原生 UITableView 可以如黄油般顺滑。


如果希望复用已有的技能,而不是从头开始学习原生语言开始学习,可以考虑 Hybrid(混合式)和 React-Native 两种方案。


对于 Hybrid 无需多言,实际上就是 Web 页面在 WebView 中的渲染,只要你熟悉移动站点开发,就能直接上手 Hybrid 开发。这种方式优点是足够简单,缺点是加载会比较慢,而且无法渲染大量数据。


对于 React-Native 而言,虽然跟 Hybrid 一样使用 JavaScript 作为编程语言,但是另一种解决思路。React 重新定义了一种渲染界面、处理数据和处理交互的编程方法,然后在各个平台中都能渲染成原生界面。通过这种方式,React 宣称实现了“Learn once, write everywhere”。


因为 React-Native 实际上会编译成原生界面,所以性能一般比 Hybrid 好。React-Native 正在提供越来越多的组件,但是要注意的是,有一些组件比其他组件性能更好。比如 Navigator 和 NavigatorIOS 都能实现应用内导航,但 NavigatorIOS 是直接封装了 iOS 的 Navigator,所以性能更好。


在选择组件时,我们需要根据性能和开发方便做权衡。如果对性能要求不高,那么使用 Navigator 即可,如果对性能要求很高,就应该针对 iOS 平台使用 NavigatorIOS,对 Android 平台使用其他技术或者 Navigator。



算法和数据结构,在大学计算机课程中占了很大比重。各种 ACM 竞赛也主要考察算法和数据结构,让一些学生认为这就是软件工程中最重要的部分。


实际上,“算法和数据结构”可以认为是和“系统设计”相反的技能树。理论走的是深度,是在追问在给定的计算能力约束下如何把一个问题解决得更快更好。而系统走的是广度,是在追问对于一个现实的需求如何在众多的技术中设计出最多快好省的技术组合。


现代的编程语言有很高的抽象程度,程序员无需掌控到内存级别的分配和释放,只要使用高级抽象的数据结构即可。JavaScript 本身没有复杂的数据结构,但是使用 prototype 和闭包可以模拟出任何数据结构(包括树和链表),更有甚者,通过第三方库(比如 underscore)可以作为增强版的 JavaScript 来使用。


“算法和数据结构”应该是基础内功,没有内功,只剩招数,无法成为绝世高手。很多自学成才的前端不理解算法,可能会写出渲染性能很糟糕的网站。


那么如何提升算法和数据结构能力呢?推荐一个网站


现在大部分题目已经支持 JavaScript。



下面聊一下数据库。



数据库往往是网站发展到一定规模之后的最终瓶颈。


这并不是我的个人观点,而是得到了大量网站证实。在用户量激增、feeds 数激增时,第一个扛不住的就是数据库。所以当我们聊 website scale,可能一半的时间都在聊数据库的扩展。



MobgoDB 是一个面向文档( document- oriented) 的 数据库, 而不是关系型数据库。面向文档有这样几个好处:


1.易于使用:不再有行(row)的概念,取而代之是文档(document),因此更加灵活,也更符合现代面向对象语言的开发者对数据的看法。此外,key 跟 value 不再是固定的类型和大小,因此,添加和删除字段变得更加容易了,实验可以很容易地进行。


2.易于扩展:数据库的大小正在加速增长,这也是符合安迪-比尔定律的。既然数据库的增长变成必然,那么如何扩展?从技术上分为纵向扩展(scale up)和横向扩展(scale out)两种思路。纵向扩展是指增加单个计算机的性能,使用更大的内存、更快的 CPU 和更大的硬盘。但是纵向扩展毕竟会遭遇性价比评价,所以现在的大型互联网系统都采用横向扩展的思路,将多个普通的计算机连接成为集群。基于此,想要增加性能只需要添加一台普通的计算机到集群就好了。


不过,管理 1000 台计算机集群显然比管理一台计算机困难的多。


MobgoDB 采用横向扩展的架构设计,面向文档的数据类型时它能够轻松地在多台服务器之间进行数据分割。MobgoDB 能够自动处理跨级群的数据和负载,自动重新分配文档,以及将用户请求到正确的机器上。这样,开发者能够集中精力写程序,而不用担心扩展的问题。


安迪-比尔定律:Andy gives, Bill takes away.(安迪提供什么,比尔拿走什么。) 安迪指英特尔前 CEO 安迪·格鲁夫,比尔指微软前任 CEO 比尔·盖茨,这句话的意思是,硬件提高的性能,很快被软件消耗掉了。


3.卓越的性能:MobgoDB 的一个主要目标是提供卓越的性能。在一些设计中,这一目标得以体现。比如 MobgoDB 能对文档进行动态填充(dynamic padding),也能预先分配文件以利用额外的空间来换取稳定的性能。总之,MongoDB 在各方面的设计都旨在保持它的高性能



关于横向扩展,腾讯云的云服务器支持弹性定价,当用户达到一定级别时可以随时扩展。此外,腾讯云还支持各种关系型数据库、文档型数据库和数据库缓存机制。现在,腾讯云有对学生的特别优惠活动,只要上传学生证,就可以以 1 元低价获得域名+服务器。(参考地址)



好了,今天的分享就到这里,谢谢大家。



涉及到的链接单独放出一页,大家可以拍照,字号很大,后排也能看到。这样也许哪天在相册翻出来也会想到吧(哈哈)。


作者介绍:


余果——腾讯社交用户体验设计部高级 UI 工程师,前端开发组负责人,UI 开发通道评委,腾讯云特邀布道师,《Web 全栈工程师的自我修养》作者。


本文转载自公众号云加社区(ID:QcloudCommunity)。


原文链接:


https://mp.weixin.qq.com/s/WJsBNqMhLvbVPjZHIxuhHA


2019-10-29 13:37606

评论

发布
暂无评论
发现更多内容

华为云GaussDB支撑华为MetaERP系统全面替换

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

如何科学判断研发团队是否在健康工作?(内附量表)

LigaAI

研发管理 技术管理 敏捷度量 企业号 4 月 PK 榜 研发效能管理

一文读懂火山引擎数智平台VeDI新品——管理驾驶舱Plus

字节跳动数据平台

企业管理 实时决策 企业号 4 月 PK 榜

微服务 - 搭建Consul集群服务,Consul配置中心

Java你猿哥

Java 架构 微服务 ssm

博睿数据蝉联中国APM市场份额第一,Bonree ONE春季正式版重磅发布

博睿数据

可观测性 智能运维 博睿数据 ONE有引力

看了这份《算法中文手册》笔记,就再也不怕字节了

Java你猿哥

Java 算法 ssm 字节 左程云

深入理解 Go 语言中的封装机制

宇宙之一粟

Go 封装 三周年连更

CV 领域的 ChatGPT?MetaAI 推出“最强”大视觉模型 SAM

Zilliz

计算机视觉 ChatGPT metaai 大视觉模型

Spring中事务嵌套使用一定得警惕这个问题了

做梦都在改BUG

Java spring 事务

人机识别技术再升级,AIGC为验证码带来万亿种变化

Geek_2d6073

又一巅峰神作!14年工作经验大佬出品“JVM&G1 GC深入学习手册”

Java你猿哥

Java JVM SSM框架 jvm调优 G1垃圾回收器

太强了!京东架构师独家微服务笔记,啃完直入字节

做梦都在改BUG

Java 架构 微服务 Spring Cloud

无惧百万级并发,GaussDB(for Cassandra)让华为推送服务更快触达

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

“烧钱”的大模型:初探成本拆解与推理优化方法

Baihai IDP

人工智能 深度学习 大模型 LLM 企业号 4 月 PK 榜

多线程如何实现事务回滚?一招帮你搞定!

Java你猿哥

Java 多线程 子线程

Spring Boot定时任务@Scheduled的多线程使用

做梦都在改BUG

Java Spring Boot 多线程 Scheduled

css-文字充电效果

格斗家不爱在外太空沉思

CSS css动画 三周年连更

小米集团Jira实战:如何在高负载状态下保持Jira性能与运行稳定

龙智—DevSecOps解决方案

快速上手Amazon SageMaker动手实验室

指剑

AI AWS Stable Diffusion Amazon SageMaker

太牛了,这是我见过把微服务讲的最全最好的SpringCloud架构进阶

Java你猿哥

Java 架构 微服务 微服务架构 Spring Cloud

一文讲透产品经理如何用好ChatGPT

京东科技开发者

人工智能 产品经理 GPT-4 企业号 4 月 PK 榜

一文带你搞定Maven全功能

Java你猿哥

Java maven ssm 生命周期 Maven仓库

硬件工程师常见问题与答疑

华秋PCB

科普 工程师 电子信息 基础知识 电子

Java最佳实践

码语者

Java

《挪威的森林》

后台技术汇

三周年连更

localedef 生成本地化文件遇到的问题

程序员与厨子

Linux Shell 信创 openEuler

Git推出大文件储存工具Git LFS,但它真的好用吗?

龙智—DevSecOps解决方案

git 版本控制 版本控制系统

一篇文章学透ApplicationContext

小小怪下士

Java spring 程序员

连续仨月霸占牛客榜首!京东T8呕心巨作:700页JVM虚拟机实战手册

Java你猿哥

Java JVM ssm 虚拟机 SSM框架

从应用看火山引擎AB测试(DataTester)的最佳实践

字节跳动数据平台

AB testing实战 A/B测试 企业号 4 月 PK 榜 对比试验

云智慧助力MLOps加速落地

云智慧AIOps社区

人工智能 机器学习 智能运维 自动化运维 算法模型

如何成为优秀的全栈工程师?面向未来的跨界开发技术(下)_文化 & 方法_余果_InfoQ精选文章