停止学习框架(1)

翻译作者: 方应杭

  这是一篇译文,原文在 Hacker News 上获得接近 500 个点赞。

  每过几年都有类似的文章出现,然而程序员却依然疲于学习新的框架,看完此文希望对你有所启示。

  那么,译文开始。

  我们是程序员,每天都在了解最新的技术,每天都在学习编程语言、框架和库。

  因为我们知道的现代编程工具越多越好,对吧?

  不停地追随 Angular、React、Vue、Riot、Ember、Knockout 的脚步还真是一件有意思的事情呢。(译注:反话)

  但这其实是在浪费时间!

  时间是人类最宝贵的资源。时间是有限的、不可再生的,你可以用钱买任何东西,却买不了时间。

  技术,就像时尚,在以光速在变化着。为了赶上它,我们需要跑的非常快。

  但是这个跑道上没有终点,所以没有赢家。


华尔街之狼

  我的导师曾经这样教我:

导师:艾德,你在做什么?我(自豪地说):我在读一本关于如何使用 GWT 构建现代 Java 应用的书呢。

导师:你读它做什么?我:作为一名 Java 开发者,我需要跟上潮流。GWT 就是现在的潮流。

导师:你在读这本书之前还读过什么书?我:我读了一本关于 Apache Tapestry 的书,那本书有 500 页。Apache Tapestry 是之前的潮流。

导师:Apache Tapestry 现在还是潮流吗?我:不是了,GWT 才是。

导师:你之前从 Tapestry 学到的技能现在还能用吗?我:不能用了呀。

导师:Tapestry 能帮助你更好地理解 GWT 吗?我:不能。不过两者都用到了一些设计模式。

导师:那就是设计模式了,设计模式能帮你解决你遇到的问题吗?我:可以,而且帮助很大。

导师:新事物来了又走,其实有很多共同点。你应该学你该学的。你应该把你 80% 的学习时间用在学习基础上,剩下 20% 的时间才是用来学习框架、库和工具的。我:哦……只留 20% 的时间学习框架、库和工具?

导师:是的。你在工作中解决问题时自然就会学会框架、库和工具。我:谢谢指导。

导师:你之后还会谢我的。

  导师的建议改变了我的生活。我把书架上关于框架的书全部都扔了,五十本书一本不剩,扔得我很开心。

  我买了一些不会过时的书,并用 80% 的学习时间来读这些书:

  • 程序员修炼之道 The Pragmatic Programmer
  • 代码整洁之道 Clean Code
  • 程序员的职业素养 The Clean Code
  • 领域驱动设计和实践 Domain-Driven Design
  • 测试驱动的面向对象软件开发 Growing Object-Oriented Software, Guided by Tests
  • 持续交付 Continuous Delivery

  我只买了一本关于最新技术的书,是关于 Spring 的。因为根据林迪效应,学习 Spring 是一项不错的投资。

林迪效应认为,对于不会自然消亡的事物,如一项技术或一个想法,其预期寿命与其当前的生命成正比;即,只要这一事物多存活一天,就意味着其预期生寿命会更长一些。

  一项技术在市场上存活得越久,就越值得我们投资(学习)它。

  不要急着学习新技术,因为这些技术很可能会死。

  时间会告诉你答案,你要学会等待。

  十年来,我参与开发过 50 个不同的软件项目。得益于我导师的建议,我学的所有东西都适用于不同的公司、团队和领域。我的知识今天仍然有用。我没有浪费我的时间。

  如果你看得更深入些,你会发现所有的软件项目都是类似的:

  • 用的编程语言虽然不一样,但是设计方法是类似的。
  • 用的框架虽然是不一样的,但是设计模式是类似的。
  • 参与的开发者是不一样的,但是如何和这些人打交道是不变的。

  记住,框架、库和工具来了又走。时间才是珍贵的。


© In Time (2011) by Andrew Niccol

  将你的黄金时间用于学习通用技能,那些不会过时的技能。

  • 不要学习微服务框架,学习演进式架构(Evolutionary Architecture)。
  • 不要学习新的编程语言,学习代码整洁之道、设计模式、领域驱动设计(DDD)。
  • 不要学习 LeSS 和规模化敏捷框架(SAFe),学习精益生产原则(Lean manufacturing principles)。
  • 不要学习 Hystrix,学习容错模式(Fault Tolerance Patterns)。
  • 不要学习 Docker,学成持续交付。
  • 不要学习 Angular、React 和 Vue,学习 Web、HTTP 和 REST。

  热门评论:

我同意你的大部分观点,但是我觉得你不用这么坚决地不学习一些东西。「学习工具」与「学习它所蕴含的设计模式」并不互斥。

2007 年的时候我曾经试图搞清楚到底什么是「数据层」以及怎么使用它,这是当时流行的 ORM 概念。我向别人问了一堆关于 NHibernate 的问题,很多人都回复我说「你应该先搞清楚原理,而不是学习这个工具」。但我心里想的是,shit,不行啊,因为我需要通过大量的实践才能理解这些原理啊。这是我学习的重要途径。

所以我觉得学习这些蕴含了丰富原理的工具其实是非常有用的。 同样的道理对很多工具都适用。比如 React ,如果没有 React 谁能理解虚拟 DOM 呢? 不过我基本同意你的论点,但是过分强调不要学习工具就有一点何不食肉糜的意味了。

另外,Docker 也不仅仅是持续交付,「学习新的编程语言」和「学习设计模式和 DDD」也不是互斥的,Angular 最难的部分也不是 Web 和 HTTP,最难的是学习 Angular 提供的这些傻傻的工具和工作流(我不是很喜欢这些玩意)。

  作者的回复:

看来我们达成了共识——学习基础常常意味着深挖某个框架、库或者工具。框架和基础都要学习,但是优先级必须是基础高于框架。

  评论二:

     当初刚从Android转前端的时候,一点基础也不会,什么html什么css,完全不懂,上手就是angular1.0,学的很痛苦,很难受,后续半年先后接触了vue和react,emmm没错,我就是框架仔。后来跳槽,我的上司告诉我,不要用框架,全部使用原生,这才让我真正感觉踏入了前端的领域。给我的实际经验就是,你从框架中学习基础,效率非常之低,当你脱离了双向绑定,脱离了全家桶,你会发现,离开框架你什么也不会。

所以就像题主说的一样,框架只是工具,我们只需要拿来用,但是真正需要学习的,是底层的原理,以及脱离框架后类似功能的实现方法。

回复一:

      既然工作要用,那就深入学一下,我就是在学习Angular的时候,掌握/熟悉/精通了一些知识: 设计模式,TS,RFP,FP,单元测试,DOM,动画等等。框架的学习反而是容易的,因为对于使用者来说其实只要有完备的文档和工程示例就可以了,其实也就是"语法"和API的掌握,真正花时间的部分还是那些通用、共性的知识。我觉得本文的意思其实是反对一直投入精力学习框架而忽视其他知识的学习,学完R再去学V,学完V再去学A,最后新出了一个框架,再去学框架,自己的时间和精力都虚耗在了这些表层封装的学习上了。

 回复二:

     你说的很棒,我几乎完全赞同;在学习框架的同时,不应该忘记基础的知识,我一直在弥补、恶补基础知识这块,我本身也清楚,基础知识够硬,去学习很多框架或者库的时,会更加得心应手,思维会更加的清晰。“但是,老板让我用Angular怎么办?/滑稽”这句话只是我的比如;初步学了几个月的Angular,再转去学React Native,发现框架大部分理论是相接近的;

我的观点:

        基础是内功,框架是招式,有了内功,招式学学很快,光学招式,很难提高。

  提问:

  假设你面前有两个应聘者,一个对框架特别熟,但是对基础知识一点都不懂;另一个对框架一点都不熟,但是基础知识特别懂。你会雇佣谁?

  小公司雇佣前者,能用就行。大公司雇佣后者,能堪重任。

原文地址:https://www.cnblogs.com/2019wxw/p/10800837.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


ANGULAR.JS:NG-SELECTANDNG-OPTIONSPS:其实看英文文档比看中文文档更容易理解,前提是你的英语基础还可以。英文文档对于知识点讲述简明扼要,通俗易懂,而有些中文文档读起来特别费力,基础差、底子薄的有可能一会就会被绕晕了,最起码英文文档中的代码与中文文档中的代码是一致的,但知识点讲述实在是差距太大。Angular.jshasapowerfuldire
AngularJS中使用Chart.js制折线图与饼图实例  Chart.js 是一个令人印象深刻的 JavaScript 图表库,建立在 HTML5 Canvas 基础上。目前,它支持6种图表类型(折线图,条形图,雷达图,饼图,柱状图和极地区域区)。而且,这是一个独立的包,不依赖第三方 JavaScript 库,小于 5KB。   其中用到的软件:   Chart.js框架,版本1.0.2,一
IE浏览器兼容性后续前言 继续尝试解决IE浏览器兼容性问题,结局方案为更换jquery、angularjs、IE的版本。 1.首先尝试更换jquery版本为1.7.2 jquery-1.9.1.js-->jquery-1.7.2.js--> jquery2.1.4.js 无效 2.尝试更换IE版本IE8 IE11-
Angular实现下拉菜单多选写这篇文章时,引用文章地址如下:http://ngmodules.org/modules/angularjs-dropdown-multiselecthttp://dotansimha.github.io/angularjs-dropdown-multiselect/#/AngularJSDropdownMultiselectThisdire
在AngularJS应用中集成科大讯飞语音输入功能前言 根据项目需求,需要在首页搜索框中添加语音输入功能,考虑到科大讯飞语音业务的强大能力,遂决定使用科大讯飞语音输入第三方服务。软件首页截图如下所示: 涉及的源代码如下所示: //语音识别$rootScope.startRecognize = function() {var speech;
Angular数据更新不及时问题探讨前言 在修复控制角标正确变化过程中,发觉前端代码组织层次出现了严重问题。传递和共享数据时自己使用的是rootScope,为此造成了全局变量空间的污染。根据《AngularJs深度剖析与最佳实践》,如果两个控制器的协作存在大量的数据共享和交互可以利用Factory等服务的“单例”特性为它们注入一个共享对象来传递数据。而自己在使用rootScope
HTML:让表单、文本框只读,不可编辑的方法有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使中国">的内容,"中国"两个字不可以修改。实现的方式归纳一下,有如下几种。方法1:onfocus=this.blur()中国"onfocus=this.blur()>方法2:readonly中国"readonly>中国"readonly="tru
在AngularJS应用中实现微信认证授权遇到的坑前言 项目开发过程中,移动端新近增加了一个功能“微信授权登录”,由于自己不是负责移动端开发的,但最后他人负责的部分未达到预期效果。不能准确实现微信授权登录。最后还得靠自己做进一步的优化工作,谁让自己是负责人呢?原来负责人就是负责最后把所有的BUG解决掉。 首先,熟悉一下微信授权部分的源代码,如下所示:
AngularJS实现二维码信息的集成思路需求 实现生成的二维码包含订单详情信息。思路获取的内容数据如下: 现在可以获取到第一级数据,第二级数据data获取不到。利用第一级数据的获取方法获取不到第二级数据。for(i in data){alert(i); //获得属性 if(typeof(data[i]) == "o
Cookie'data'possiblynotsetoroverflowedbecauseitwastoolarge(5287>4096bytes)!故事起源 项目开发过程中遇到以上问题,刚开始以为只是个警告,没太在意。后来发现直接影响到了程序的执行效果。果断寻找解决方法。问题分析 根据Chrome浏览器信息定位,显示以下代码存在错误:
AngularJS控制器controller之间如何通信angular控制器通信的方式有三种:1,利用作用域继承的方式。即子控制器继承父控制器中的内容2,基于事件的方式。即$on,$emit,$boardcast这三种方式3,服务方式。写一个服务的单例然后通过注入来使用利用作用域的继承方式由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值
AngularJS路由问题解决遇到了一个棘手的问题:点击优惠详情时总是跳转到药店详情页面中去。再加一层地址解决了,但是后来发现问题还是来了:Couldnotresolve'yhDtlMaintain/yhdetail'fromstate'yhMaintain'药店详情http://192.168.1.118:8088/lmapp/index.html#/0优惠券详情
书海拾贝之特殊的ng-src和ng-href在说明这两个指令的特殊之前,需要先了解一下ng的启动及执行过程,如下:1)浏览器加载静态HTML文件并解析为DOM;2)浏览器加载angular.js文件;3)angular监听DOMContentLoaded事件,监听到时开始启动;4)angular寻找ng-app指令,确定作用范围;
angularjs实现页面跳转并进行参数传递Angular页面传参有多种办法,我在此列举4种最常见的:1.基于ui-router的页面跳转传参(1)在AngularJS的app.js中用ui-router定义路由,比如现在有两个页面,一个页面(producers.html)放置了多个producers,点击其中一个目标,页面跳转到对应的producer页,同时将producerId
AngularJS实现表格数据的编辑,更新和删除效果实现首先,我们先建立一些数据,当然你可以从你任何地方读出你的数据var app = angular.module('plunker', ['ui.bootstrap']);app.controller('MainCtrl', function($scope) { $scope.name = 'World'; $sc
ANGULAR三宗罪之版本陷阱      坑!碰到个大坑,前面由于绑定日期时将angular版本换为angular-1.3.0-beta.1时,后来午睡后,登录系统,发现无论如何都登陆不进去了,经过调试,发现数据视图已经无法实现双向绑定了。自己还以为又碰到了“僵尸程序”了呢,对比药店端的程序发现并没有什么不同之处。后来自己经过一番思索才隐约感觉到是不是angular的版本造成的,将版本换为之前
JS实现分页操作前言 项目开发过程中,进行查询操作时有可能会检索出大量的满足条件的查询结果。在一页中显示全部查询结果会降低用户的体验感,故需要实现分页显示效果。受前面“JS实现时间选择插件”的启发,自己首先需要查看一下HTML5能否实现此效果。 整了半天,不管是用纯CSS3也好,还是用tmpagination.js还是bootstrap组件也好,到最后自己静下心来理
浏览器兼容性解决之道前言 浏览器兼容性一直是前端开发中不得不面对的一个问题。而最突出的就是IE。对绝大多数公司来说,兼容IE6的性价比已经很低,而IE7则几乎已经绝迹。所以,常见的兼容性下限是IE8。这也正是Angular1.2x的兼容性目标,Angular团队声明:Angular的持续集成服务器会在IE8下运行所有的测试。但这些测试不会运行在IE7及以下版本,它们也不会保证An
JS利用正则表达式校验手机号绪 由于项目需求,需要在前端实现手机号码的校验。当然了,对于基本的格式校验应该放在客户端进行,而不需要再将待校验的手机号发送至服务端,在服务端完成校验,然后将校验结果返回给客户端,客户端根据返回的结果再进行进一步的处理。如此反而复杂化了处理过程。 其实,处于安全考虑,应该在服务端进行二次校验。以下为在客户端的JS中校验手机号码格式
基于项目实例解析ng启动加载过程前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理。回过头来总结一下angular的启动过程。 下面以实际项目为例进行简要讲解。1.载入ng库2.等待,直到DOM树构造完毕。3.发现ng-app,自动进入启动引导阶段。4.根据ng-app名称找到相应的路由。5.加载默认地址。6.Js顺序执行,加载相应模版页sys_tpls/