我是 justjavac,可以来问我任何问题!

#50

问题一、前端圈提到 Node.js 似乎都离不开全栈,但是圈外的也有不少声音,类似“别动不动就全栈、真是误导人…”。能不能说一下,优秀的全栈工程师需要具备什么技能?

全栈目前被黑的太多了,我一般不称自己为全栈工程师。提到全栈工程师,很多人会提到 Facebook,因为 Facebook 只招 full stack engineer。而我自己也不知道到底什么是真正的 full stack engineer。

既然我不能定义什么是全栈工程师,那么我就说说那些“非全栈工程师”吧。

有很多这种工程师(开发者),比如前端工程师,他们认为自己是很优秀的前端工程师,每天都在学习各种新的前端知识和框架,但是他们的信条的坚决不学习半点后端的知识,每天面对的就是各种接口。有些人从来没用过 java,一点都不懂 php,不知道这些语言的优点和缺点,却无时不刻的黑着这些语言。

还有一些后端工程师长年累月在 linux/mac 上开发,却连个最简单的自动化脚本都不会写,让他写写 shell/python/ruby,他会直接反驳,我是 java 工程师,这些是运维工程师该干的。

所以,我觉得所谓全栈工程师,就是不畏惧任何技术,横向提升自己。如果一个人说自己是全栈工程师,我的第一感觉不是这个人什么都会,而是会觉得,我和他的沟通成本应该很低。

Web 开发工程师(可以的话,可以从 Web 前端 / Web 后端 / Web 全端 一起讲述,或者不)刚开始工作后,一年和三年的职业发展规划分别应该怎么做?

目前有很多开发者自称全栈工程师,其实是什么都懂点,但是什么都不精通。即便如此,我给新人的建议仍然是先适当扩展自己的广度,然后还得是深度。

我觉得工程师的竞争力,不在于做了 N 个产品,而在于打磨过一个产品就够了。

我从 java 转前端后给自己定的目标是,既然工程师那就要搞工程化,当时 nodejs 周边生态还没有这么号,很多开发者也是刚刚听说过 node,我也没认为这个小框架会掀起如此波澜。然后使用 java 社区的 ant,再结合一些 python 脚本把我们公司的前端重新规划了一遍,基本完成了前后端的半自动化。后端 java,中间层 php,前端 jQuery。

三年的职业发展规划太远,按 3 个月来规划吧。如果这个月的工作不是在重复上个月的,那就是在进步。

目前公司技术氛围不浓厚,作为员工,怎么去改善?

无能为力,我也因为这些问题离职了。

最近越来越认一句话(记不清了,好像是玉伯说的): 我想要更高的 Level,不是为了更高的工资,而是为了更高的话语权。

怎么看待技术圈内的鄙视链?

浮躁。

每当遇到社区的风吹草动,都有很多人问:java 有前途吗?nodejs 有前途吗?大数据有前途吗?区块链有前途吗?

我只有一句话:不存在有前途的语言,只存在有前途的人

我身为一个 java 程序员却学习 C/C++ 只是为了研究 java 虚拟机,转前端就因为遇到瓶颈了,不仅仅是技术上的瓶颈,还有其它,因为在天津,研究 java 虚拟机是屠龙技,但是天津却没有龙。

3 Likes
#51

看目的吧。

如果为了赚钱,那就去工资高的。

如果为了镀金,那就去大厂。

#52

推荐你这个, https://github.com/Bogdan-Lyashenko/Under-the-hood-ReactJS

有中文版。

#53

多谢解答~ 那么 es6 modules 本身有什么不好实现的地方吗?导致他在 node 10 才有,还需要用 flag 启动

#54

首先做一名程序员,然后做一名前端程序员

我一直以为数据库、数据结构、算法、操作系统原理、……这些都是每个程序员的必备技能,但是现在找一个 cs 基础扎实的程序员已经成为一种奢侈了。

我不是来吐槽现在的程序员现状的。

就好比以前的修理工,一定要非常懂得机器的内部原理和方方面面,才能把机器修理好。而现在借助各种工具和设备,可以轻松定位到故障,然后救助工具快速准确的完成维修。IT 行业也一样,现在的程序员也可以借助各种库和框架来快速搭建各种平台,来完成各种软件的开发,也正式如此,才极大的降低了企业实施 IT 的成本,也带来的 IT 的繁荣。

如何学习?

看书学呗。

很多人喜欢看文章,喜欢看神文,喜欢看“一篇文章读懂orm”,“十分钟掌握redis”,…… 其实学习,还得是系统化的学习,很多文章(包含我写的大部分文章)我把他们定义为:“扩展视野”。

我在这里就不提什么“元知识”的概念了,太玄学。

我把学习分为两大类:技能和知识。

通过视频学到的,大部分都是技能,也有一些是扩展视野。只有书或者系列文章才是作者精心归纳总结的系统化知识。

所以我的建议是,买本书慢慢看,遇到不懂的多查资料,多问。

1 Like
#55

不是 es6 modules 不好,而是 nodejs 对 esm 的需求不是那么迫切,而且 esm 到底给 nodejs 带来了什么呢?

就算是前端,又有多少人是这么使用 esm 呢?

<script type="module" src="module.js"></script>
<script type="module">
  import { fn } from './utils.js';
  fn();
</script>

esm 的 import 对 webpack 最大的一个优势就是 tree shake。

如果做同构应用,目前还得是 cjs。

但是又因为 esm 是规范,所以 nodejs 不得不实现它。

esm 的大规模使用,还有一些时间,毕竟那些第三方库都是使用的 cjs。

#57

有一个方法就是:带着目的去读

我本身的 cs 基础也不是很好,编译原理也是我自学的。我最初读的时候,我只是想知道 某个 es 规范,或者某个内置函数到底是如何实现的。所以我知道现在也没有读过关于机器码生成相关的代码。

看了 V8 后,发现有很多奇技淫巧可以提升性能。比如 使用隐藏的 Hash code 优化哈希表的方式来提升 Map / Set / WeakSet / WeakMap 的性能 等等

1 Like
#58

使用React以后,我们通过修改数据代替修改DOM,用户的一个操作可能会触发一次ajax请求,数据返回返回之后可能造成多个组件的渲染,有什么好方法计算在用户角度的渲染性能呢?

#59

j神你好,现在前后端分离,前端责任变得重要更重要,却得不到老板的重视及认可,以及甚至比不上后端程序员的晋升体系,请问你怎么看待

#60

既然不管是 node 还是前端,对 esm 的需求都不大,那么 esm 这个规范是面向什么需求而被设计出来的呢?

#61

我想问一下如何快速的学习react

#63

成为前端高级开发工程师,需要具备哪些硬性条件?

#64

jjc大神,先说背景:一枚前端小白,创业公司,自己的前端leader偏业务,在公司也比较倡导技术为业务服务,目前公司业务处于初步上升期,功能迭代速度的需求大于技术深度的积累和广度的扩展
想问:作为开发人员,如何平衡技术提升和业务需要?

#65

你觉得 authing.cn 这个项目怎么样

#66

Jjc老师之后去哪里高就了

#67

官方好像并没有"建议存储在 state 里"吧。你可能是看了 rfc 0006-static-lifecycle-methods 而产生的误解吧。

getDerivedStateFromProps 的作用就是用来替代经常被滥用的 componentWillReceiveProps 的,而当 16.3 使用异步渲染后,componentWillReceiveProps 会产生副作用。

在我们使用 React 时,只有“把 props 存储在 state 里”时才会使用到 componentWillReceiveProps,因此 getDerivedStateFromProps 的很多例子都是这种场景。

#68

至于这个问题,已经有人问过 react 作者了 can React support feature like keep-alive in Vue?,而且 Dan Abramov 也给出了回答:

有两种方式:

第一种方式,把状态提升到没有卸载的祖先组件。或者使用 Redux。

第二种方式,不好卸载需要 “keep alive” 的组件,而仅仅是把他隐藏。

第三方解决方案你可以试试 React-Keeper

#69

使用正则实现模板引擎,除非这个模板引擎很简单,否则效率肯定不高。而 underscore 的 template 也算不上真正的模板引擎,和 jade(pug) 对比一下就知道了。

(jade 已经改名为 pug)

一般的模板引擎都会涉及到编译原理的相关知识,虽然称为模板引擎,但基本可以认为是一门语言。

首先是分词,以 pug 为例。

当我们再 my-file.pug 文件里面写:

div(data-foo="bar")

那么引擎会分词为:

{
  "type": "Block",
  "nodes": [
    {
      "type": "Tag",
      "name": "div",
      "selfClosing": false,
      "block": {
        "type": "Block",
        "nodes": [],
        "line": 1,
        "filename": "my-file.pug"
      },
      "attrs": [
        {
          "name": "data-foo",
          "val": "\"bar\"",
          "line": 1,
          "column": 5,
          "filename": "my-file.pug",
          "mustEscape": true
        }
      ],
      "attributeBlocks": [],
      "isInline": false,
      "line": 1,
      "column": 1,
      "filename": "my-file.pug"
    }
  ],
  "line": 0,
  "filename": "my-file.pug"
}

最终经过一系列步骤,生成代码:

<div data-foo="bar"></div>

编译原理在 eslint、bable、webpack 等工具里面都会用到。

如果你想自己写个 eslint 规则,那么就需要用到编译原理的知识。比如你是个 PHP 黑,你要求你的所有 js 代码里面变量名和函数名不能包含 php,如果你使用正则表达式查找会出现问题,因为在字符串里面可以使用 php,在注释里面也可以使用,只有在变量名和函数名里面不能使用。这时你可以写一个 eslint 插件,比如叫 no-php。

3 Likes
#70

最不喜欢的当然是 proposal-private-methods

class Counter extends HTMLElement {
  #xValue = 0;

  get #x() { return #xValue; }
  set #x(value) {
    #xValue = value; 
  }
}

如果再选一个非 Stage 3 的那就是 proposal-optional-chaining

由于种种原因,optional-chaining 将不能使用 a?.b 语法,而新的语法是:

a ?& . b    // instead of   a ?. b
a ?& [ i ]  // instead of   a ?. [ i ]
a ?& ( x )  // instead of   a ?. ( x )

WTF!!

如果我提案的话,那么肯定是提一些其它语言有,而且我觉得很实用(语法糖)的功能,我之前翻译过一篇文章 现代编程语言最有趣的 10 大特性

其中有一些 JavaScript 以及由相应的提案了,有一些还没有。我比较喜欢的:

lambda 函数的默认参数

Kotlin 语法(使用 it 作为默认参数)

strings
  .filter{ it.length == 5 }
  .map{ it.toUpperCase() }

对比 JavaScript

strings
  .filter{ it => it.length === 5 }
  .map{ it => it.toUpperCase() }

还有自动科里化

2 Likes
#71

应该再学一门语言。

曾经有 php 程序员问我如何提升自己,我告诉她学 java。

我以自觉得程序员应该掌握 3 门语言:

一门工业级的语言,比如 java,这是用来吃饭的。

一门脚本语言,比如 python/ruby,自己写一些东西的时候可以使用,我之前的大部分自动化脚本工具都是使用 perl 写的 :joy: 后来才慢慢改成 python。因为如果用 java 写,那不是自虐吗?

一门自己平时使用的语言,我虽然之前一直写 java,但是我自己的所有网站都是使用 php 搭建的,只有个别服务(比如搜索)是使用的 java。现在正在慢慢迁移到 nodejs。

以上三门语言也会有重回。

对待任何一门语言不能只盯着语言的缺点,然后去黑它。也不能因为自己喜欢某门语言而无脑的去摩拜它。学习语言的长处,也要正式语言的缺点。

再者就是学习一门不同范式的语言,比如 @jiyinyiyong 题叶大大现在就再研究 ClojureScript,好高大上啊。学习一门完全不同的语言可以开阔思路和思维方式。这不仅仅是“方法论”的提高,更是“知识观”的升华。

如果你要选一门语言,如果为了工作,我推荐 go/java。如果为了学着玩,我推荐学一门小众的新语言,比如 kotlin/ClojureScript/reason。

2 Likes