为什么后端老是觉得前端简单
# 为什么后端老是觉得前端简单?
# 后端角度:
作者:粲粲爸爸 链接:https://www.zhihu.com/question/409197374/answer/1370454927 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
项目从需求分析开始,第一个目标是分析出实体关系(E-R 图),再通过事件风暴划分出领域。(以及其他分析工具,如状态迁移图,时序图,类图,部署图,决策矩阵……)
同时我们需要做技术选型,比如决定用什么语言(Java,Scala,JavaScript(Node.js),C#,Go,PHP……),用什么框架(Spring,Vert.x,Play,Express,Moleculer,.NET……)。
然后决定使用什么数据库(Oracle,MySQL,PostgreSQL,MongoDB,Cassandra……),如何实现高可用、高并发、水平扩展(ProxySQL,复制集,分片)。有时可能需要同时使用多种不同类型的数据库。
还要考虑数据如何缓存(Redis,Memcached,GemFire)及如何实现高可用、高并发、水平扩展(Redis集群及哨兵)。
如果你的系统需要全文检索,那么需要选择全文检索引擎(Elasticsearch,Solr……)。
如果你的系统有统计业务那么还需要考虑使用什么样的时间序列数据库(InfluxDB,Graphite,PostgreSQL+TimescaleDB,HBase+OpenTSDB……),ETL方案(InfluxData)及数据可视化(Grafana)。
如果你的系统有社交网络业务那么还需要考虑使用图数据库(Neo4j)。
大多数时候你都需要一个分布式文件系统(MooseFS、Ceph、HDFS,GridFS……)并选择文件处理工具(GD2,ImageMagick,FFmpeg)。
如果你的系统用于处理大数据(如物联网),那么 Apache Hadoop + Spark 可能很有用。说到物联网,MQTT、CoAP、Modbus 等协议必须了解。
如果你的系统是企业级应用,基于 LDAP 或 ActiveDirectory 的单点登录,矩阵式组织结构(企业 2.0),基于角色的访问权限控制(Role-Based Access Control)必不可少。
如果你的系统需要向第三方授权,那么需要引入 OAuth 2.0,实现访问令牌(JWT)、刷新令牌。
如果你的系统规模足够大,那么必须引入领域驱动设计(DDD),实现微服务,实现容器化(Docker)。
为治理微服务,并使微服务之间可以通信,需要服务注册中心和配置中心(Zookeeper,Consul,Apollo……),需要消息队列、流平台(Kafka、RabbitMQ、NATS……),并要考虑高可用、高并发、水平扩展、消费顺序等问题(复制、分区)。
解决客户端如何访问微服务的问题我们需要后端代理(如 NginX),API 网关(如 Spring Cloud Gateway,Moleculer API Gateway)。
更进一步,为了降低运维成本,提高部署效率,需要实现持续集成与持续部署(Git,GitLab,Jenkins,TeamCity……),实现自动化测试和质量保证(JUnit,SonarQube,JaCoCo……),实现服务编排(Kubernetes),实现服务网格(Istio)。企业级项目模块足够多时我们可能还要使用到私有制品库(Nexus Repository OSS)以保障多个团队之间的协作。
我们还要了解系统运行状况,需要对服务器及应用进行监控(Prometheus,Zabbix……),对日志进行分析(Filebeat+Logstash+Elasticsearch)。
……以及以上所有内容的方法论(领域驱动设计,测试驱动开发,Scrum,DevOps,云原生……)及落地手段(各种语言技能、Shell 编程、协议知识、开发库……)。
然而技术只是手段,业务才是核心,所以为了给客户带来价值,客户的业务我们都要搞懂,不仅是热门的物联网、人工智能、区块链,机器学习,P2P,还有具体的电商、医疗、CRM、机械制造、航海……做到哪里学到哪里。
这里面每一项都能写本书。
当然,前端也不简单。
Web 前端需要会 HTML,CSS(以及Sass、Less),JavaScript,SVG;各种 API,如 Canvas,WebSocket,WebRTC;各种框架,如 Angular、React、Vue.js(所以还得会 TypeScript),以及这些框架的组件库;老家伙们还学过 Prototype.js、jQuery(当然,我们老家伙从 ASP/JSP/PHP 时代过来,那时前后端是不分离的);大项目要懂微前端;做游戏要会 Cocos2D-js、PixiJS 或 Phaser。
桌面应用开发要懂 C++、QT,或者 .NET Framework(但是比较局限),或者 Xcode(仅 Mac),或者 Java(JetBrains 产品基本都是基于 Java 开发的),或者 Flutter(未来?);如果对性能没有极致要求 Electeon 也是一个选择。
移动应用目前主要是 iOS 和安卓,前者主要是 Objective-C/Swift + Xcode,后者主要是 Java/Kotlin + Android Studio,但 Dart + Flutter 有一统移动端开发的野心。
所有类型的前端开发都要懂用户交互设计,都要理解 HTTP 协议及 RESTful 接口风格,懂 Socket……
然而通常前端划分很明确,如果他们不感兴趣,他们的书架上不需要那么多书。
# 前端也不容易
作者:PerishWithHonour 链接:https://www.zhihu.com/question/409197374/answer/1373509698 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一开始,我是做后端的,写前端几乎都是用现成的模板,用别人的代码块,JQuery一把梭过去。现在补完前端,发现JS和H5的世界已经发生了天翻地覆的变化,从ES3.1 到ES5 ,ES6,ES7还有现在的ES11。js不再是那个只能在浏览器里蹦跶的语言了,基本啥都能写,桌面端的Electron,移动app的 WebView/Hybrid Native解决方案,各种小程序语法,哪一个不要学习成本?觉得前端简单,无非就是不过脑子说事。
就拿上传文件来说,会自己按照需求设计组件吗?会自己全盘负责联调吗?知道怎么精确监控HTTP请求全过程吗?还有websocket这种东西,大多数人写代码的贼难看。没有node带来的前端项目工程化体验,很多代码看起来就和屎一样又臭又长。好了,说到工程化,复杂的Webpack了解下,babel保姆用一下,ts.config.json 你也来个?前端复杂了,但是也变强大了,最典型的就是SSR的出现,把页面请求的资源从nginx上面打包好的SPA,换到了前端服务器的html模板中来了。总的来说,就是尽量的在体系中发挥js和DOM打交道的能力。还有就是找工作要用到的各种框架技术,都是要花时间去学的,就一个React周边技术栈多的一批,还有Angular8+ ,东西多吧?想高阶地使用?那又要费不少时间,我自己学了3个月才勉强做成了一套自己的Angular工程模板(IndexedDB, ng2-stompjs, ngx-umeditor,Ng-Zorro, RouteReuseStrategy, PipeTransform, HttpInterceptor,Karma-overall-test)。前端绝对不简单,反倒是复杂繁杂,选个UI组件库都一大把可以想到的。否则你自己写CSS、LESS、SASS和SCSS吧,代码多的一批。能把前端样式写得能自适应的还懂Flex布局,真不多,CSS动画就更不用说了,CSS3这玩意可比XAML玄学多了。
/***
- 看到有人点赞,再写一些 补完js的历程吧
*/
一开始接触前端的时候,是不知道H5,H4规范什么的,不管三七二十一直接html开头就是 ,js也写的贼拉跨,什么玄学eval乱用一气,call() ,apply() ,bind()就会用绑定,教学的人也教什么ES标准具体的新增内容,给jquery获取的jq对象绑定就完了。箭头函数也没人教,function内的this指向啥也是蒙的。学完java的经验告诉我对象和函数两个东西,不能搞混啊,结果js不是这样的,又不是typescript有???.d.ts文件给你指明某变量是函数还是对象。后来直接上手vue.js,data()=>{return { ???} }什么鬼,为啥是函数,往上一看extends,感情js还能玩起了继承?一看vue的源码,所有vue组件都是Vue原型对象的子对象,也就是“组件是可复用的vue的实例”。es6的东西?啥规矩啊?看了一下原来是对原型链的一种使用啊,可是发现原型链也没学,恶补了Object各种属性和方法,怪不得有人说js可以oop编程,原来如此。哦,所以data要设计成函数为啥啊?每个函数js 作用域内部数据是独一份的。接下来为了方便使用当前vue的数据,把getData()函数移交给vm._data再传给原生vm.$options.data的实例——data属性(即vue属性中的data属性),然后又在getData()中设计return data.call(vm, vm)重新定位this指向当前vm!!这样的化,在开发的时候,我们就可以直接用this.data.??? 来使用 data()=>{ return {obj} }返回的任意数据了。后来学了python发现这些脚本语言都是这么灵活的,什么builtins,init,name,dict,开发者直接print出来就能把对象看个究竟。不像憨憨java,搞个reflect,一堆又臭又长的api,要不是有AOP的生态资源(Annotation式开发真香),Java笨死了要。对了,还得回来说下组件和标签,一开始学开发的时候觉得原生的HTML标签像是黑盒子,你一写他就给你显示出来了,不像VB你一拖控件,还能做设计,也能改代码,对应的class实例代码。咋web开发就要写style调样式呢,后来学ts发现了lib.dom.d.ts,哎哟我擦,原来各位标签也是对象啊。这就是DOM对象吧,直到这个时候我才反应过来,之前只是听说有这么一个定义,现在浏览了下block.rnc,phrase.rnc等等定义文件,前前后后都融会贯通了起来。
完犊子!感情之前我是一点也不懂js?是的,我心态没放好,js虽说设计的很烂,但也好歹是一门脚本语言。前端的路还有很久要走,不求精通,只求全面了解。
# 其他
作为一家较为知名的互联网公司(你肯定用过产品)的前端开发,我觉得你说的这些都不叫难,甚至不需要特意去学习,用到的时候翻一下资料就行。当然纯粹的业务后台开发也不算难,我写过一段时间golang后台。什么叫难呢,我觉得涉及到图形学,数据库底层之类的跟算法相关的开发,才能称得上难
前端好点吧,容易搞点小副业, 我一个工具类型的小程序, 上线半年, 现在靠广告税后5K左右, 加上我本身的工资, 一个月快20K了