《Web全栈工程师的自我修养》

最近看了《Web全栈工程师的自我修养》,以下是个人感觉书中比较好的内容,记录下来方便以后查看。


服务器、数据库、服务器编程语言、HTML、CSS、JavaScript等组合在一起就是一个“栈”,这个“栈”是用来制作Web站点的,所以又叫Web栈(Web-Stack)

服务器、数据库、服务器编程语言、iOS或者Android开发技术组合在一起称为App栈

软件工程师事业的3个关键词,分别是技术、成长和声望。

全栈工程师是指,一个能处理数据库、服务器、系统工程和客户端的所有工作的工程师。根据项目的不同,客户需要的可能是移动栈、Web栈,或者原生应用程序栈。全栈工程师除了在一个专精知识领域有深入研究之外,还以知识广博和解决问题能力强著称,可以采用“先精后广,一专多长”的流学习程来成为全栈工程师。从工作中锻炼出来的发现问题、洞察需求、设计解决方案并开发出初始版本产品的能力,是全栈工程师最大的优势。全栈工程师应该关注用户体验,并且掌握用户体验相关的知识。

如果一个公司需要招聘“全栈工程师”,可能要求的三个那能力就是一专多长、关注商业目标、关注用户体验。

全栈工程师的目标往往是快速解决商业问题,不一定需要长期完美的方案。使用方便好用的框架能大大节省学习成本和开发时间,所以有些时候技术选型的步骤是:先选择框架,然后选择语言。

一个代表性的全栈框架————MEAN,它是MongoDB-Express-AngularJs-Node.js的缩写,是从数据库、服务器到前端页面的一个完整技术栈。

最常使用的服务器是基于Linux的。Web发布使用Apache,数据库使用MySQL,服务器端编程语言使用PHP的组合,它们往往一起统称为LAMP(Linux-Apache-MySQL-PHP)整体解决方案。


前端工程师:产品视觉稿在得到产品经理和交互设计师等多方确认之后,会交给前端工程师,由前端工程师制作页面,实现视觉稿以及交互功能。从头衔上的变化就可以看出,这时候才真正开始编码。前端工程师需要非常熟悉HTML、CSS和JavaScript,以及性能、语义化、多浏览器兼容、SEO、自动化工具等广泛的知识。关于网络性能和HTTP协议,作为大公司的前端工程师是非常看重的。现在前端开发岗位开始要求有移动端页面开发的经验,或者熟悉响应式页面开发。

招聘初级工程师时,一般会考察:

  • 对浏览器兼容性的了解
  • 对HTML/CSS/JavaScript语法和原理的理解
  • 对编辑器和插件的熟悉程度
  • 对调试工具的了解程度
  • 对版本管理软件的熟悉和应用经验
  • 对前端库/框架的使用
  • 标准/规范

招聘中级工程师时,一般会考察:

  • 对代码质量、代码规范的理解
  • 对JavaScript单元测试的熟悉
  • 对性能优化的应用和理解
  • 对SEO的应用和理解
  • 代码部署
  • 移动Web

招聘高级工程师时,除了上面考察点以外,还会考察:

  • 代码架构
  • 安全
  • 对自动化测试的理解

越接近高级工程师,越考察对某个点的本质理解,以及在项目和团队中的引导作用,而不是对某工具的使用经验。

前端工程师要有一个基本常识,那就是结构、表现和行为要分离。技术层面上讲,网站的内容使用语义化的HTML标签,而不掺杂任何表现和逻辑;网站样式表现用CSS来描述,既能在多个页面之间复用,也可以根据不同用户来分别定义外观;页面行为逻辑用JavaScript来实现,这样保证浏览器在禁用JavaScript的时候,页面也能正常渲染和使用。

建议,在大三或者大四的方向课程设计上,或者选修课设计上增加与时俱进的前端开发课程,使用业界最新的编程语言去教学,这样对毕业生、对用人单位都是好事。


一个是一系列对象、方法等代码,应用程序可以把这个库“链接”进来。库起到了重用代码的作用,省下了重写这部分代码的工作量。

一个框架是一个软件系统中可重用的一部分,它可能包含子程序、库、胶水语言、图片等一些“资源”,这些资源一起组成了软件项目。框架不像库,可能包含多种语言,某些功能可能通过API的方式让主程序调用。

GASP库发现jQuery动画慢的问题,就重点优化JavaScript动画部分,它号称动画速度比jQuery快20倍,而且能开启硬件加速,在某些情况下比CSS动画性能还要好。

互联网领域发展很快,问题的优先级永远都是在动态变化的。所以团队往往每半年或者三个月就要回顾一下当前形势,并制定新的工作计划。如果新计划不是您擅长的,怎么办?您应该马上开始学习新的技术,这就是所说的关注问题,而不是醉心技术。

如何创造更大的影响力?影响力就是跨界解决问题。高级工程师可以选择往上下游去扩展自己的能力,并承担更多的责任,给公司带来更大的收益,也给自己带来更大的成长空间。

永远从商业目标的角度来决定学习哪些东西,而不是纯粹为了锻炼技术能力而去学习。在开源项目中贡献代码,说明您有能力阅读和编写好的代码,这是公司直接需要的技能,此外,这还能说明您有能力与他人协作:开源代码总是需要协作的。开源项目还能表明您对新鲜事物有热情,表明您也许英语能力不错,有查阅文档的能力...简直是一箭N雕。

Web性能优化:

  • 压缩源码和图片
  • 选择合适的图片格式
  • 合并静态资源
  • 开启服务器端的Gzip压缩
  • 使用CDN
  • 延长静态资源缓存时间,不过需要通过改文件名的方式确保资源更新时用户会拉取新资源
  • 把CSS放在页面的头部,把JavaScript放在页面的底部

在最开始,硅谷之所以名字当中有一个“硅”字,是因为当地企业多数是从事加工制造高浓度硅的半导体行业和电脑工业。随后,互联网公司和软件公司渐渐取代传统的硬件公司,让硅谷获得了新的生命,但硅谷这个名字保留了下来。在硅谷从诞生到发展壮大的整个生命周期中,斯坦福大学起到了很大的最用,称之为硅谷的母亲也不为过。

https://www.smashingmagazine.com/
https://tutsplus.com/

沉淀和总结是很重要的,在腾讯,设计师做完一次设计定稿之后,就会把设计的思路,包括整体的设计风格、设计规范和色彩的确定等都总结成一封邮件或者PPT,发送给部门同事。

为什么服务器对并发请求数这么敏感?虽然服务器的多个进程看上去是同时运行,但是对于单核CPU的架构来说,实际上是计算机系统同一段时间内,以进程的形式,将多个程序加载到存储器中,并借由时间共享,以在一个处理器上表现出同时运行的感觉。由于在操作系统中,生成进程、销毁进程、进程间切换都很消耗CPU和内存,因为当负载高时,性能会明显降低。

Apache通过模块化的设计来适应各种环境,其中一个模块叫做多处理模块(MPM),专门用来处理多请求的情况。Apache安装在不同系统上的时候会调用不同的默认MPM,我们不用关心具体的细节,只需要了解Unix上默认的MPM是prefork。为了优化,可以改成worker模式。prefork和worker模式的最大区别就是,prefork的一个进程维持一个连接,而woker的一个线程维持一个连接。

Nginx是Apache服务器不错的替代品或者补充:一方面是Nginx更加轻量级,占用更少的资源和内存;另一方面是Nginx处理请求是异步非阻塞的,而Apache则是阻塞型的,在高并发下Nginx能保持低资源、低消耗和高性能。由于Apache和Nginx各有所长,所以经常的搭配是Nginx处理前端并发,Apache处理后台请求。

DDoS是Distributed Denial of Service的缩写,DDoS攻击翻译成中文就是“分布式拒绝服务”攻击。

HTTP 1.1引入分块传输编码,允许服务器为动态生成的内容维持HTTP持久链接。如果一个HTTP消息(请求消息或应答消息)的Transfer-Encoding消息头的值为chunked,那么消息体由数量不确定的块组成————也就是说想发送多少块发送多少块————并以最后一个大小为0的块为结束。

通过Chrome开发者工具中的PageSpeed工具,可以快速获得关于站点性能优化的建议。

缓存有这样几种功效:

  • 存储频繁访问的数据
  • 内存缓存减少磁盘I/O
  • 保存耗时的操作,以便下次使用

可以开启MySQL查询缓存来提高速度,并且减少系统压力。可以通过修改MySQL安装目录中的my.ini来设置查询缓存。

memcached支持集群,而且有诸多优点,所以可以有效利用多台机器的内存,提高命中率。

表征性状态传输(Representational State Transfer,REST)是Roy Fielding博士在2000年发表的博士论文中提出来的一种软件架构风格。Restful的目的是定义如何正确地使用Web标准,优雅地使用HTTP本身的特性。原则上是对资源、集合、服务(URL)、get、post、put、delete(操作)的合理使用。

浏览器缓存设置最佳实践:

  • 对于动态生成的HTML页面使用HTTPS头:Cache-Control:no-cache。
  • 对于静态HTML页面使用HTTPS头:Last-Modafied。
  • 其它所有的文件类型都设置Expires头,并且在文件内容有所修改的时候修改Query String。

风投在评估一个创业项目是否会成功的时候,有一个指标就是创始人是否是自己产品的目标用户。

混合模式App同时使用Web技术与原生程序语言开发。App启动后,它的全部页面或者部分界面中,使用网络视图(WebView)技术来实现。WebView能加载显示网页,可以将其视为一个浏览器,它一般使用WebKit渲染引擎加载显示网页。常用的对WebView进行性能优化的方法:

  • 把WebView的部分或者所有资源打包在App中。需要网络数据时,可以通过网络请求json或者体积比较小的数据格式,然后通过本地页面模板和资源来渲染。这种方式的缺点是,App发布包体积会变大。
  • 把需要加载的资源设置好预先加载。可以在App启动时从后台下载需要的资源,并缓存在手机沙盒中备用。这种方法的好处是不会增加包体积,不过第一次访问的时候可能因为没有预加载资源而导致等待时间比较久。
  • 使用HTML5 Manifest技术实现资源缓存。HTML5引入了应用程序缓存,这意味着Web App可进行缓存,并可在没有互联网连接时访问。这种方法的好处是,缓存所有资源到本地之后,如果希望更新WebView,可以在服务器上更新资源列表和Manifest文件。App检测到Manifest文件的修改,就知道资源已经更新,可以开始下载新的资源了。
  • 不要把整个App的主要逻辑都使用WebView来实现。要结合原生技术和WebView各自的优缺点,根据不同的场景选择合适的技术。原生技术的优点在于能很好地操作App存储数据;实现页面间切换、高性能动画、大量数据的界面。WebView的优点在于开发快、技术简单;前端开发者能够利用已有的CSS3和JavaScript知识;页面能够从服务器端更新;能够分享到社交平台;在多个平台上共用等。
  • 设计得更像一个App,而不是一个网页。在这种做法诞生初期,还会把App分为原生App和混合模式App,不过从2014年以来,已经不这样区分了。一般认为一个App中有一些HTML页面是非常自然的事情,所以这个概念在渐渐淡化。

点击WebView中的一个按钮,我希望弹出一个原生的警告框,应该怎么实现呢?在Android中,可以使用WebView.addJavascriptInterface方法来实现互相通信。在iOS中,需要使用shouldStartLoadWithRequest委托。

CVS有以下几个缺点:

  • CVS不支持文件重命名,如果重命名一个文件,之前的修订历史记录就会丢失
  • CVS没有原子性提交,如果提交很多文件,提交到一半的时候出错,那就麻烦了
  • CVS只支持文本文件,无法提交二进制文件

SVN解决了这几个问题,并加入了一些新特性:

  • SVN对二进制文件的版本管理,使用了节省空间的保存方法,只保存和上一版本的不同之处
  • 目录也有版本历史。重命名、复制和删除也会保存在版本历史记录中,当然,要用SVN的重命名来操作
  • 分支的开销比较小

关于npm这个词的意义,一般人可能以为是Node Package Manager的缩写,但实际不是这样的。npm是“npm is not an acronym”(npm不是一个缩写)这个递归定义的简写。

所有的脚本语言都是直接运行,不需要编译成可执行代码,只不过Python等脚本运行在服务器,用户看不到源代码,而JavaScript运行在浏览器,所有人都能看到源码。

好的架构有以下几个要素:

  • 有合适的分离粒度
  • 最小知识原则
  • DRY(Don't Repeat Yourself,不要重复您自己)
  • 最小化预先设计,只设计必需的内容
  • 通过良好的层级,让文件易于找到
  • 在代码层面,有一致且可执行的命名规则

将编程语言编译成机器码有两种传统的方法:使用编译器(compiler)预先编译,或者使用解释器(interpreter)一边编译一边运行。编译器的工作方式是,通过编译程序直接将我们的源代码翻译成当前系统环境下CPU可执行的机器码,下次只需执行这些翻译完成后的机器代码即可。这种方式的好处是执行效率非常高,缺点就是可移植性很差。解释器的工作方式是,将工程师编写的代码,一句一句解释给CPU执行,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较慢。这种方式的好处是平台无关性,以及这个“编辑-解释-除错”的循环通常比“编辑-编译-运行-除错”的循环省时许多。

传统JavaScript引擎通常先把JavaScript代码编译成字节码,然后再通过字节码转译为机器码。v8引擎直接把JavaScript代码编译成机器码,所以性能得到了很大提高。

有些语言被设计为可以在任何领域使用,比如C、Java、Python和XML,它们被成为“通用语言”。

有些语言被设计为特定领域专用,比如HTML和CSS,称为为“特定领域语言”。

KISS原则是“Keep it simple, stupid”的缩写,意思是说软件设计当中应该注重简约的原则。这一原则认为,大部分系统的设计越简单越好,有不必要的复杂性都应该避免。如果一个系统非常复杂,就应该分解为多个简单的组件,做好足够的分解和抽象。

虚拟专用服务器(Virtual Privte Server,VPS)是把一台服务器分割成多个虚拟专享服务器的优质服务。

设计模式的关注点在于:

  • 高效编写代码
  • 高可复用性
  • 抽象带来的可读性

23种软件设计模式,分为三大类:创建型模式、结构型模式、行为模式。创建型模式,就是用来创建对象的模式,它对实例化的过程进行了抽象,帮助一个系统独立于如何创建、组合和表示它的那些对象,如单例模式、惰性初始化模式、工厂方法、抽象工厂、建造模型、原型模式、对象池模式和多例模式等。结构型模式,主要解决类、对象、模块之前的耦合关系,如适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式等。行为模式,用来识别对象之前的常用交流模式并加以实现,如此,可在进行这些交流活动时增强弹性,如观察者模式、黑板、责任链、命令、解释器、迭代器、中介者、备忘录、空对象、模板方法和访问者等。

MVC的本质是代码的分离,它不光在Web开发中大放异彩,在桌面软件和移动端软件开发中也随处可见。

DRY是“Don't Repeat Yourself”的缩写,意思是说,在一个系统里,对于任何数据或者变量,都应该配置在有且只有一个地方,其它的地方都应该引用这里的数据。这样,需要改动数据的时候,只需调整这一处,所有的地方就都变更过来了。

推荐使用英文搜索的原因:

  • 英文的技术资料更多
  • StackOverflow有完善的鼓励机制
  • Google的搜索能力非常强
  • 英语世界的语言风格比较严谨

Jeff Atwood提出了著名的Atwood定律:“任何能够用JavaScript实现的应用系统,最终都必将用JavaScript实现”。

自我意识,是指您能够精确地觉察自己的情绪波动。

社会意识,是指您能感知周围人的情绪,并敏锐捕捉到周围发生的事情。

自我管理,是指您能根据自我情绪的感知,灵活积极地调控自身行为。

关系管理,是指您感知到周遭的“情绪场”之后,能够掌控自我情绪并把握他人情绪值,来让双方进行更好的互动。

时间管理四象限

你可能感兴趣的:(《Web全栈工程师的自我修养》)