我是工业聚,可以来问我任何问题!

#35

在学习技术上,我是兴趣驱动的。学习技术,对我而言,跟玩撸啊撸,守望先锋等游戏有相似的乐趣,并且更不容易腻,成就感也更强。这是一个很好的状态,我不知道怎么进入了它,我希望后面可以一直保持住这种热情。

我的成长 80% 发生在工作内容,个人项目只有 20% 的增益。但恰恰是个人项目,使我得到机会去付诸工作实践。所以从重要性来讲,个人项目里我的积累,也很重要。目前可以说是工作和业余的技术学习,对技术成长而言,同等重要。

1 Like
#36

反复的造轮子是一个好的练习,跟反复的复制粘贴代码不一样。这个问题跟前面的有点相似,可以看一下我对前面的回复。

#37

这个问题非常好。在进入技术领域之前,我对数学、物理学、哲学、心理学以及演化论都很感兴趣,我认为它们是理解世界的不同维度,缺了任何一个,都缺少了一个重要的、不可替代的视角。

我对技术的兴趣,也延续了上面的特征。计算机是另一个庞大的、重要的世界的体现,如果不懂计算机及编程,就像一个麻瓜,所见皆如魔法。

仅仅掌握编程语言,也不足够,还需要对编程语言如何被创造有所了解。这就进入编程语言的设计和实现的领域。除此之外,很多问题,无法手写规则解决,必须通过特殊途径,间接解决。这就进入了人工智能/机器学习的领域。而在很多领域,最后都会触及到数学跟编程的结合,目前最贴近数学的是函数式编程语言,又是一个新领域。

正是对世界和自我的反思与好奇,不断引领我去了解不同的领域。虽然难以成为每个上述领域的专家,但光是得到一些知识的理解,都足够让我兴奋很久。

在现代,没有人可以掌握人类创造的所有知识。我们需要根据自身兴趣,对知识做一个优先级的划分。我的划分方式是先去掌握纲领性的知识,它们可能是所有知识的核心部分,可以创造新知识,或者推导出旧知识。数学、物理、哲学、心理学、演化论、计算机编程、编程语言实现、人工智能/机器学习、函数式编程等,都属于我认为的纲领性知识的范畴。

2 Likes
#38

vdom 的技术实现太细节,不适合在问答里铺开。可以参考一些材料,如 virtual-dom.js,代码量不多。

如果有兴趣了解更多,也可以去看 react,react-lite, preact, inferno,anujs 之类的源码。

1 Like
#39

这个需要发布系统的支持。

如果是同构应用,在本地编译好,有一些必要性。我们得在 server 端和 cdn 里都发布一下 js,如果在分别发布系统里的服务器里编译,有可能因为 npm 依赖版本的不一致而产生不同的文件 hash,造成 404。所以,本地编译好,再分别发布到 server 端和 cdn,可以保证内容是一致的。

#40

这个问题我之前做个分享,可以看一下 slider文章

1 Like
#41

react-lite 是我学习 react 过程中的一个意外产物,恰好公司有轻量版的需求,所以就用在公司项目里了。

react-imvc 是我探索 react 最佳实践过程中的所得,恰好公司也有整体升级技术栈的需求,所以就推动它落地了。

在造轮子之前,我深入地参与业务代码的开发和维护,了解公司业务的特点和需求,理解其他同事频繁遇到的问题,和期望得到的工具是什么,然后才开始造轮子。

1 Like
#42

工作不是技术成长的全部,工作之外,可以有基于兴趣的技术探索和积累。而且,工作内容,其实也有很多可挖掘和拓展的地方。靠外界环境去提供一个开发而广阔的学习,基本上不太可能。也不符合公司用人的专业性要求。内心的自我驱动力更可靠。

1 Like
#43

对 Backbone 和 Vue 的了解较多,Angular 和 Ember 不是很了解。当初选择 React 是恰巧当时它比较火,所以去学习和使用,然后有了更深的理解,开始在工作里使用,就这样上了这个车。

不管是学习其他框架还是其他语言,我认为,都要以腾空自己的心态去感受;不要刻意去想,这不就是 React 里的 xxx 吗?这不就是 C# 里的函数重载吗?虽然我们第一次在 React 或 C# 里发现了某个语言特性或者框架特性,但并非这个特性的内部机制和用途,就跟我们第一次接触的框架和语言绑定了。

我们应该去理解脱离框架和语言表象的背后的抽象事物,而不是用这个具体事物去理解另一个具有相似性质的具体事物。用水果去理解苹果和香蕉,而不是用苹果去理解香蕉。

1 Like
#44

2018 年我的学习方向主要围绕几块:1)函数式编程(主要是 Haskell);2)人工智能(主要是 Machine Learning);3)下一代前端开发范式。

#45

1、关于机器学习,我前面有个回答是相关的,可以参考一下。我建议从传统机器学习算法学起,就像卡马克 的做法(虽然不必那么硬核,但手写算法还是有很大帮助)。数学、编程和机器学习建模等,是并驾齐驱,互相增益的关系,在学习过程中,自然而然地会发现需要补充的数学部分,编程部分和建模部分是什么。从数学开始学起,离做出一个东西会隔很远很远,而且,数学是学不完的。不必在手写算法上停留过长的时间,积累了一定的经验和体会之后,应该是时候去玩框架了。目前的资料和教程也越发丰富。比如 Google 的机器学习速成

2、React、Vue 和 Angular 目前只是在数据和视图的绑定以及状态管理上,提供了一些便利。但在 css/style 布局,UI 动画等方面,还有很大的发展空间,等到 houdini 落地,或许会有一个兼顾布局、动效、数据、视图和状态管理的新范式,FRP 是其中一个方向。另外,js 语言的发展,也可能改善一些写法,如 pipeline operator, partial applicationpattern-matching 等。以及 elm, reasonml 等编译到 js 的语言,和 wasm.js 开启的新的竞争领域的冲击,也在推动前端的发展。jQuery -> MVC| MVVM | Flux 这个转变,只是开始,远未到终点。

3、前端和后端,本来就是人为划分,是之前或现在的分工需求。随着 Backbend、OPS 、 GUI开发乃至人工智能等技术和工具的发展,分工的模式被改变是意料之内、情理之中。做技术的人,要保持「终身学习」的决心和习惯,去迎接更多的挑战,并从中感到乐趣。

4、目前的「知识付费」处于一个野蛮生长的萌芽阶段,绝大多数知识,并没有进入付费者的大脑。不过,如果把「知识付费」看成是一个像「密室逃脱」的娱乐来看,去掉知识的神圣感后,其实也算不错的体验。我们愿意让肉体去游乐场付费玩过山车,也可以让大脑在网络上玩「知识体验的过山车」。在现阶段,想要获得有竞争力的长进不能只寄希望于「知识付费」里。

5、前端门槛低是事实。是好是坏,要看有什么角度或者处于什么情境。门槛低,意味着竞争者多,如果是一个不求进步,只图安稳的人,会感觉到竞争者很多,到处都是想抢饭碗的人。但另一方面,如果是一个对技术有追求,有热情,学习的方法论正确的人,他更容易脱颖而出。

6、社招时的判断因素很多,对不同工作年限的候选人,衡量的方式也不同。对于初入社会的人,主要看对方的学习能力、学习的方法论、获取知识的媒介以及当前的技术基础等。对于资深的候选人,主要考察对流行框架和编程范式的认知和实践经验,对疑难咋整的处理办法,对团队协作的管理策略,以及对软件开发架构和设计模式的个人体悟。

2 Likes
活动预告(已经完结): 工业聚 ama 周三晚上进行
#46

刚看到,不知道现在问问题还有没有效~

想请问下,react-lite 是您的个人业余项目还是职务作品呢?
如果是个人项目,请问您是如何在工作之余抽出时间来完成这样一个费时费力的项目的?如何平衡好写代码和生活的关系?
如果是职务作品,请问您是怎样说服同事以及领导,以获得足够的时间和资源来投入这样一个可能算是重复造轮子的项目?除了起初的 IE 兼容以外还有其他什么理由吗?

#48

react-lite 的来源可以看前面的回答。

它不是为了解决 IE 兼容问题,最初是练手项目。恰好公司有场景,需要用,就去用了。

react-lite 跟 react 可以互相切换,出了问题,可以切换回 react,有保底。这样容易说服团队去尝试。

作为一个 lite 版本,维护精力没有想象的那么大。

#49

你好,看到你18年有想做下一代前端开发范式,有大概的框架和想法么?机器学习在客户端你觉得可能做些什么呢 ?

1 Like
#50

你好工业聚,我很好奇你这里提到的下一代前端开发范式,能描述一下现在的想法吗?

#51

好火爆啊,这么多人提问。我就问下,你什么时候有空,可以请你吃饭吗

#52

看源代码有什么好的方法吗?

#53

下一代前端开发范式,是 18 年的学习方向,未必能在 18 年完成或者有重大进展。前面一条回答里,介绍了我对现在前端所处发展阶段的观点(变革刚刚开始,远未结束)。

可以列举一下,我认为可能成为下一代前端开发范式的候选列表:

1)人工智能,我在之前的分享里提到了UI 开发的 N 种模式,AI 不仅会是下一代,也有能力成为下下一代,甚至最终形态。不过,目前的完成度,尚不足以威胁到专业前端工程师的饭碗。

2)函数式编程/响应式编程(FRP)。除了老牌的 rxjs, xstream 之外,immer 和 callbag 这两个小而精的库,揭示了可以用很少的代码,实现灵活而且功能强大的机制。并且,stream 式的状态处理,既可以胜任动效实现(比如这个用 callbag 实现的压缩后 6kb 的拖拽小球),也能 Hold 住复杂应用的状态管理。在某些场景里,它拥有当前范式不具备的竞争力,出于学习成本、体积和编程风格等多方面的因素,现在尚未成为主流。还只是当前流行方案的补充(redux-observable, vue-rxjs),或者只是小众框架(cycle.js)。未来,通过 JS 新的语言特性带来的写法优化(如 pipeline operator 等),或许会有一些变化。

3)新语言如elm ,reasonml 等编译到 js 的语言,虽然暂时无法挑战 js 的主流地位,但社区里不时有它们的呼声。此外又有 wasm.js 等异数,将来前端 GUI 开发,或许会从 JS 一枝独秀,变成百花齐放的阶段。

上面的 3 个维度并不互斥,可能互相裹挟彼此而成长起来。前面我说的另外两个学习方向,如 Haskell 和机器学习,也算是在为探索前端新范式寻找不同思路。

// 拖拽小球关键代码
function test(ball) {
  const start$ =
    fromEvent(ball, 'mousedown')
    |> mergeWith(fromEvent(ball, 'touchstart'))
    |> share

  const end$ =
    fromEvent(document, 'mouseup')
    |> mergeWith(fromEvent(document, 'touchend'))
    |> mergeWith(interval(5000))
    |> take(1)
    |> share

  const move$ =
    fromEvent(document, 'mousemove')
    |> mergeWith(fromEvent(document, 'touchmove'))

  const coords$ =
    start$
    |> flattenMap(downEvent =>
      move$
      |> takeUntil(end$)
      |> map(getCoords(downEvent))
      |> startWith({ left: 0, top: 0 })
    )

  const time$ =
    start$
    |> flattenMap(() => 
      interval(1000)
      |> takeUntil(end$)
    )

  const clear$ = start$ |> flattenMap(() => end$)

  const spring$ =
    clear$
    |> flattenMap(() =>
      spring(springOptions)
      |> takeUntil(start$)
    )
    |> map(({ currentValue }) => currentValue)

  coords$
    |> forEach(({ left, top }) => {
      setTranslate(ball, { left, top })
    })

  time$
    |> forEach(count => {
      ball.innerHTML = count
    })

  clear$
    |> forEach(() => {
      ball.innerHTML = ''
    })

  spring$
    |> sampleCombine(latest(coords$))
    |> forEach(([current, { left, top }]) => {
      setTranslate(ball, {
        left: left * current,
        top: top * current
      })
    })
}
1 Like
#54

感谢 @Jade 的回答. 这个帖子到此结束了. 也谢谢各位参加活动的同学, 以及 @injune1123 在活动文案方面的支援.

这个帖子接下来锁定, 有相关内容可以再原先的预告帖回复. 活动预告(已经完结): 工业聚 ama 周三晚上进行

如果想到有好的活动, 也欢迎在"线上活动"分类发起, 召集小伙伴来参与. 感谢大家.

1 Like
closed #55