为了顺利重新进入职场,我这一个月一直在做有目的的训练,锻炼自己的实践能力(因为这是我的弱项之一-front-endprojects经验较弱,加上在专业知识方面,coding和analysis更倾向于后者),而不是随意自由学习。但是,在具体的学习题目上,除了参考和比较常规的面试题来找出一些基础题目外,我对什么是“最有价值”的学习题目没有任何指导。其实我很相信自己的直觉,但难免会有盲点和价值冲突。不知道明天面考官要我具备什么样的能力。我的担心不无道理,因为软件开发技术岗位一直都是难招难找。企业不知道如何评估应聘者的实力,求职者也不知道什么才是最重要的。这里有一个推理。在面试和面试场景中,假设公司和求职者分为两类:公司分为懂得评估技术的职位(C1),以及缺乏评估技术的公司(C2)。求职者分为有能力但不会求职的人(P1)和能力较弱但会做题的人(P2),那么面试就会有四种情况:C1P1C1P2C2P1C2P2如果是假设成立,那么只有C1P1和C2P2会通过面试,但真正面试成功的只有C1P1,因为只有这个组合才是良性的。要形成良性结合,关键点其实很明显,即企业掌握了对技术岗位候选人能力进行评估的技术,包括评估目标(T)和评估方法;同时,求职者的目标(T)和学习方法更有效地提高水平。这里对T的理解是最重要的一点,无论对招聘人员还是求职者都具有重要意义。最近在学习函数式编程的过程中,从EricElliott(《Programming JavaScript Applications》一书的作者)的这篇文章《10 Interview Questions Every JavaScript Developer Should Know》中找到了一些相关的有价值的想法,并尝试着翻译。目录每个JavaScript开发人员首先应该知道的10个面试问题,您知道哪两种编程范式对JavaScript开发人员有用?二、什么是函数式编程?三、传统的类继承和原型继承有什么区别?四、函数式编程(FP)和面向对象编程(OO)各自的优缺点是什么?五、什么场景下最适合使用类继承?七、“对象组合优于类继承”是什么意思?第八,什么是双向绑定和单向数据流,它们有什么区别?九、单体架构和微架构的优缺点是什么?十、什么是异步编程,为什么对Web开发很重要?每个JavaScript开发人员都应该知道的10个面试问题其中之一是:评估候选人的最佳方式是结对编程练习。评估候选人最有效的方法是“与候选人一起完成编程练习”。意思是你和应聘者坐在一起,让应聘者敲键盘,而你多看多听,少说话。例如,演示从TwitterAPI中提取推文数据项并将它们显示在时间线上。虽然合作伙伴练习很有价值,但没有任何一种练习是决定性的,面对面的对话(访谈)也是一种非常有用的工具[em]。不过,不要浪费时间询问语法或语言怪癖。您需要看到大局,并询问对整个项目有重大影响的架构和编程范例的经验知识。EM:临场小练习所能测试的能力(范畴)是有限的。有很多深刻的经验或知识,只能通过其他方式去探知,比如对话、话题试题;并且没有非常具体的答案(测试标准),比如如何检测候选人的功能性编程能力?语法细节和API功能特性的知识很容易搜索到,但是像软件工程智慧或JavaScript开发人员从经验中获得的通用特性和习语这样的经验知识很难通过搜索在短时间内学习。EM:这里提到了重点。作为招聘人员,有必要通过查找资料来测试候选人半小时内无法掌握的技能。求职者也必须明白这个道理。EM:当然,作者提到的工程智慧和编程经验是需要研发的。鉴于以上结论,对于Web开发和Javascript,我认为可以在面试中使用以下十个问题来有效评估应聘者的开发能力:(EM:我不认同作者的十篇文章,还有一些补充以及翻译中的删减,无论是观点还是内容。根据我个人的看法,我实际上已经亲自回答了这些问题。)首先,你知道哪两个?编程范式对JavaScript开发者有用吗?JavaScript是一种多范式(multi-paradigm)编程语言,支持过程式编程、面向对象编程和函数式编程三种(基本上是两种)编程范式。JavaScript通过原型继承支持面向对象编程,通过按值函数(所谓的一等公民)支持函数式编程。二、什么是函数式编程?函数式编程是一种使用纯函数(或数学函数)构造程序的编程范式。纯函数的优点是没有副作用(避免使用共享数据sharedstate),不使用可变数据[em];Lisp(1958年)是最早支持函数式编程的语言之一,深受lambda演算的启发。Lisp和许多Lisp家族语言在今天仍然很流行。JavaScript支持函数式编程,并且越来越流行。比如闭包、高阶函数、函数参数传递等,都是JavaScript社区的重要表现。EM:纯函数的优点有待论证,有待分析纯函数(函数)与类对象的区别。三、传统的类继承和原型继承有什么区别?传统的类继承是指一个类(类)是“一个功能”的模板或设计模板(蓝图),可以用来派生子类(子类继承父类的所有功能并可以扩展),并创建multiple一个对象实例(使用new操作);通过类继承的设计可以实现程序的细化层次类分类法。但是,由于子类和父类的继承关系是一种白盒复用(父类没有完全封装,对子类可见),最终的类层次结构会高度耦合,这也是最大的问题类继承。与类继承不同,原型继承没有类的概念(类是抽象函数的“模具”),一切都是对象实例。“功能代码继承复用”是通过直接连接两个对象实例来实现的,比如通过特殊的对象工厂函数(factoryfunctions)生成一个新的复用对象,或者复制(Object.create())。一个“targetnewobjectinstance”[em]可以直接连接需要的功能小对象实现复用功能,是一种非常灵活的代码复用方式。EM:无论是哪种代码重用技术(类继承,或者原型组合,或者其他),其目标任务都是生成新的对象实例,实现软件功能的开发。在JavaScript中,原型继承有以下应用表现:原型链(concatenativeinheritance)、原型委托(prototypedelegation)、函数继承/闭包(functionalinheritance)、对象组合(objectcomposition);四、函数式编程(FP)和面向对象编程(OO)的优缺点是什么?FP和OOP作为完成编程“任务”的“工具”,各有适用性、优缺点。OOP的优点是直观,对象由数据和方法组成的概念容易理解,容易解释方法调用的含义。OOP倾向于使用命令式风格而不是声明式风格。命令式的文体读起来就像是一套直接的指令让计算机去执行,非常形象。OOP的缺点OOP通常依赖于共享状态。对象和行为通常绑定到同一个实体,并且可以由任意数量的函数以不确定的顺序随机访问,这可能导致不希望的行为,例如竞争条件。FP的优点使用纯函数作为功能单元,程序员可以避免任何共享状态或副作用[em],从而消除多个函数竞争相同资源而导致的错误。与OOP相比,FP的大规模函数组合,比如所谓的point-free风格,大大简化了复杂函数的组合,提高了代码的复用性。EM:使用和不使用共享状态都是技术,重点是“功能实现”的任务;也就是说,为什么我们必须使用中间状态?“纯函数”和“类对象”是两种编程范式最大的“工具”区别。此外,FP倾向于声明式和指称式的函数命名风格[em]。FP并不倾向于细化函数运行的步骤,而是着眼于“函数做了什么”。这为重构和性能优化留下了巨大的空间,它甚至允许您用更高效的算法替换整个旧算法,只需很少的代码更改(例如,memoize,或用惰性求值代替急切求值)。EM:更倾向于用名词而不是动词来表达“功能”EM:这两个工具的区别在于FP侧重于功能的形式和逻辑关系,而OOP则使用纯函数来实现数据的计算功能加工。很容易移植到多处理器或分布式计算集群环境,不用担心线程资源冲突、竞争条件等。大函数)可能会降低代码的可读性,因为生成的代码通常是抽象的,不够简洁,不够具体。越来越多的人习惯于OOP和命令式编程而不是函数式编程,因此即使是函数式编程中的常见习语也会让新的团队成员感到困惑。还有,FP的学习曲线要??比OOP陡峭得多,因为OOP的广泛流行使得OOP的语言和学习资料更加会话化,而FP的语言更加学术化和正式化。总的来说,OOP使用共享状态来“实现复合功能”是有害的,尽管它非常直观;高度使用OOP的代码库相对“顽固”且脆弱,难以更改且错误百出;FP除了这些不足外没有OOP,程序更容易阅读和维护,但适应FP风格需要一些时间。五、什么场景下最适合使用类继承?几乎没有适用场景,可以避免类继承,除非只有一层继承;六、什么场景下最适合使用原型继承?在JS中,几乎只要需要代码复用,就可以使用原型继承,当然也包括函数复用不适用的时候(FP也提供了复用机制)。JS中的原型继承分为三种:一是委托(Delegation),比如使用原型链;第二,拼接(Concatenative),比如mixins,`Object.assign()`;第三,创建新的(Functional),比如Closure;每一种原型继承都有自己适用的场景,但是它们都归结为组合重用,这是一种has-aoruses-aorcan-do的关系,这与is-a的关系是相反的。七、“对象组合优于类继承”是什么意思?第八,什么是双向绑定和单向数据流,它们有什么区别?九、单体架构和微架构的优缺点是什么?十、什么是异步编程,为什么对Web开发很重要?
