├── .gitignore ├── AngularJS权威教程(中文版).pdf ├── AngularJs学习笔记.docx ├── C++ ├── C++语法(前六章).doc ├── C++语法(第七章).doc ├── C++语法(第九章).doc ├── C++语法(第八章).doc ├── C++语法(第十一章).docx ├── C++语法(第十三章).doc ├── C++语法(第十二章).doc ├── C++语法(第十五章).docx ├── C++语法(第十六章).docx ├── C++语法(第十四章)(未完成).doc ├── C++语法(第十章).doc ├── MFC学习笔记.doc └── MFC的一些函数.doc ├── HTML及CSS.docx ├── JavaScript .docx ├── Nodejs ├── NodeJs学习笔记.docx └── node.js开发指南.pdf ├── Vuejs ├── Vuejs技巧篇.docx └── vue学习笔记.doc ├── bootstrap.docx ├── dojo学习.docx ├── jquery.docx ├── linux.docx ├── readme.md ├── shell命令比较复杂一些的(带索引).md ├── 《人月神话》 └── 《人月神话》笔记摘抄.md ├── 世界各国中英文名对照.js ├── 写一个web版的360工具箱.docx ├── 前端架构详谈(1)纯前端发布 ├── 01.png ├── 02.png └── readme.md ├── 原生JavaScript.docx ├── 台式电脑候选.md ├── 大型项目前端架构浅谈.md ├── 如何使用虚拟机来运行linux ├── 01.jpg ├── 02.jpg ├── 03.jpg ├── 04.jpg ├── 05.jpg ├── 06.jpg ├── 07.jpg ├── 08.jpg ├── 09.jpg ├── 10.jpg ├── 11.jpg ├── 12.jpg ├── 13.jpg ├── 14.jpg ├── 15.jpg ├── 16.jpg ├── 17.jpg ├── readme.md └── vsftpd.conf ├── 数据库.docx ├── 数据结构 ├── STL.docx ├── 二进制文件的读写.docx ├── 排序.docx ├── 数据结构总述.docx ├── 查找算法.docx ├── 树.docx ├── 第二章算法.docx └── 迭代器.docx ├── 笔记本候选.md ├── 网易云课堂 ├── 网易云课堂(DOM编程艺术).docx ├── 网易云课堂(HTML和CSS).docx ├── 网易云课堂(JavaScript).docx └── 网易云课堂(页面架构).docx └── 西安互联网开发招聘汇总(2019.5.24).md /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | -------------------------------------------------------------------------------- /AngularJS权威教程(中文版).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/AngularJS权威教程(中文版).pdf -------------------------------------------------------------------------------- /AngularJs学习笔记.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/AngularJs学习笔记.docx -------------------------------------------------------------------------------- /C++/C++语法(前六章).doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(前六章).doc -------------------------------------------------------------------------------- /C++/C++语法(第七章).doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第七章).doc -------------------------------------------------------------------------------- /C++/C++语法(第九章).doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第九章).doc -------------------------------------------------------------------------------- /C++/C++语法(第八章).doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第八章).doc -------------------------------------------------------------------------------- /C++/C++语法(第十一章).docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十一章).docx -------------------------------------------------------------------------------- /C++/C++语法(第十三章).doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十三章).doc -------------------------------------------------------------------------------- /C++/C++语法(第十二章).doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十二章).doc -------------------------------------------------------------------------------- /C++/C++语法(第十五章).docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十五章).docx -------------------------------------------------------------------------------- /C++/C++语法(第十六章).docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十六章).docx -------------------------------------------------------------------------------- /C++/C++语法(第十四章)(未完成).doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十四章)(未完成).doc -------------------------------------------------------------------------------- /C++/C++语法(第十章).doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/C++语法(第十章).doc -------------------------------------------------------------------------------- /C++/MFC学习笔记.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/MFC学习笔记.doc -------------------------------------------------------------------------------- /C++/MFC的一些函数.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/C++/MFC的一些函数.doc -------------------------------------------------------------------------------- /HTML及CSS.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/HTML及CSS.docx -------------------------------------------------------------------------------- /JavaScript .docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/JavaScript .docx -------------------------------------------------------------------------------- /Nodejs/NodeJs学习笔记.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/Nodejs/NodeJs学习笔记.docx -------------------------------------------------------------------------------- /Nodejs/node.js开发指南.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/Nodejs/node.js开发指南.pdf -------------------------------------------------------------------------------- /Vuejs/Vuejs技巧篇.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/Vuejs/Vuejs技巧篇.docx -------------------------------------------------------------------------------- /Vuejs/vue学习笔记.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/Vuejs/vue学习笔记.doc -------------------------------------------------------------------------------- /bootstrap.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/bootstrap.docx -------------------------------------------------------------------------------- /dojo学习.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/dojo学习.docx -------------------------------------------------------------------------------- /jquery.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/jquery.docx -------------------------------------------------------------------------------- /linux.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/linux.docx -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ##学习笔记 2 | 3 | 除了PDF,剩下的都是我自己在学习的过程中写下来的笔记 4 | 5 | 就是这样=.= -------------------------------------------------------------------------------- /shell命令比较复杂一些的(带索引).md: -------------------------------------------------------------------------------- 1 | # 常见shell命令 2 | 3 | ## 01、判断目录是否存在,不存在则创建 4 | 5 | 当前目录不存在mysql-data文件夹则创建mysql-data 6 | 7 | 示例代码: 8 | 9 | ```bash 10 | if [ ! -d "mysql-data" ]; then 11 | mkdir mysql-data 12 | fi 13 | ``` 14 | 15 | ## 02、shell 中获取文件真实路径(绝对路径) 16 | 17 | 获得绝对路径: 18 | 19 | ```bash 20 | # 通过 readlink 获取绝对路径,再取出目录 21 | work_path=$(dirname $(readlink -f $0)) 22 | ``` 23 | 24 | 拼接路径: 25 | 26 | ```bash 27 | work_path="$work_path/mysql-data" 28 | ``` 29 | 30 | 注意,如果拼接时候出现问题,那么可能是你在windows下创建的shell脚本,然后在linux下执行。 31 | 32 | vi命令编辑脚本,然后输入 ``$set ff=unix`` 来修改编码; -------------------------------------------------------------------------------- /《人月神话》/《人月神话》笔记摘抄.md: -------------------------------------------------------------------------------- 1 | ## 《人月神话》读书笔记摘抄 2 | 3 | ### 前注 4 | 5 | 1、引用部分表示是该内容引用原文。 6 | 7 | 由于篇幅所限,引用的原文会摘抄、省略部分语句、或补充一部分以增加表达性。但会确保尽可能和原文保持一致。 8 | 9 | 2、引用部分后的 Pxx 表示是书籍的第 x 页。 10 | 11 | 3、页码之后是我个人评论。 12 | 13 | 4、书籍采用的是《人月神话》四十周年纪念版。 14 | 15 | ### 第二章节:人月神话 16 | 17 | > 系统编程的进度安排背后,第一个错误的假设是:一切将运转良好,每一项任务仅花费它应该“花费”的时间。 18 | 19 | P15。 20 | 21 | 结果就是所有由没有丰富开发经验的人所评估的工期,都会导致项目比预期时间 delay。 22 | 23 | 结果,要么就是团队成员疲于加班,要么就是项目延期。 24 | 25 | --- 26 | 27 | 28 | > 第二个谬误的思考方式是在估计和进度安排中,使用的工作量单位:人月 29 | 30 | P16 31 | 32 | 这里的人月,指的是工时计算 m 人 * y 月(日) 的工作量。 33 | 34 | 该公式的成立,仅限于可以完全分解的任务,并且他们之间不需要相互交流。 35 | 36 | 实际上,当需要更多的沟通交流时,2 个人每日的工作效率并不是 2 人日,而是 1.8 人日,如果人数继续上升,人均效率还会再次下降。甚至可能会出现 5 个人的开发效率,反而不如 2-3 个人的开发效率高。 37 | 38 | --- 39 | 40 | > 某些任务的计划进度,可能受限于顾客要求的紧迫程度,但紧迫程度完全无法控制实际的完成情况。就好像约好在两分钟之内完成一个煎蛋……(略)一面已经焦了,而另一面还是生的。 41 | 42 | P21 43 | 44 | 甲方的要求是很难拒绝的,但无底线的接收甲方的要求,结果只可能是毁灭性的——交付一个非常糟糕的项目。 45 | 46 | 一个又能合理应对甲方,又可以保证项目工期不至于被无止境的压缩的解决方案是: 47 | 48 | 【在项目中做一个看起来技术含量比较高,但实际开发工期并不久的功能。然后告诉甲方,我们有一个非常 cool 的东西,他非常先进,是业内最先进的技术,但需要更多的工期。】 49 | 50 | 也就是说,我们预期 3 个月的工期,报给甲方的是四个月~五个月(实际并不需要那么久),在甲方要求压缩工期后,时间变回我们预期的 3 个月的工期。于是项目顺利的按期完成了。 51 | 52 | 当然,这需要公司有水平比较高的开发人员,可以跟进比较潮流的技术,并运用到项目里。 53 | 54 | 55 | 56 | ### 第三章节:外科手术队伍 57 | 58 | > 这些研究表明,效率高和效率低的实施者之间个体差异非常大,经常能够达到数量级的水平(差异)。 59 | 60 | P29 61 | 62 | > xxxx(三个外国人,名字略),曾对一组具有经验的程序人员进行测量,在该小组中,最好的和最差的表现在生产率上平均为 10:1;在编程速度和空间上具有 5:1 的惊人差异!简言而之,2万美元的程序员的生产率,可能是 1万美元的程序员的 10 倍。 63 | 64 | P30 65 | 66 | 根据我的经验来看,假如初级开发人员的效率是 1,那么中级开发人员在 3-5,而高级开发人员 从 10~50 都是存在的。并且某些功能,只有高级开发人员有办法实现。 67 | 68 | 这也就是为什么,各种互联网大厂,宁愿花 2w~3w/月,甚至更多的薪资去请一个高级开发人员,而不是选择用 8-10k/月的薪资,去请更多一般程序员。 69 | 70 | --- 71 | 72 | > (跳着节选一部分)Milss 的建议。一个团队以类似外科手术的形式组件: 73 | > 74 | > 外科医生:首席程序员; 75 | > 76 | > 副手:首席程序员的副手,能完成任何一个工作,但经验不如首席; 77 | > 78 | > 管理员:外科医生的老板,负责决定人员、薪酬、办公空间。通常不需要全职负责; 79 | > 80 | > 工具维护人员:负责管理工具,确保基本服务的可靠性(这个类似运维); 81 | > 82 | > 测试人员:搭测试平台,提出测试方案和测试用例。 83 | 84 | P32~P34(略去了一些国内少见的人员职位,原文共 10 个角色) 85 | 86 | 简单来说,这个就是明确一个开发团队的将和兵,以及一些重要的工具人。 87 | 88 | 由首席程序员定技术方案(而不是民主讨论),其他人负责执行该技术方案,并确保项目高效率沟通交流。让不同角色的人专心于自己的任务,越专一,效率越高。 89 | 90 | 换句话说,系统是一个人或者最多两个人思考的产物,而其他专业人员负责解决问题。当人员之间出现分歧时,由外科医生(首席程序员)来决定使用什么方案,达成客观上的一致性。 91 | 92 | 这种方案是一个大概 8~20 个人的团队。当系统需要更多的开发人员时,首席程序员将在同样的团队结构里,担任专业人员的角色(即承担一个功能的开发角色),由更高级的首席程序员分配任务。 93 | 94 | ### 第四章节:贵族专制、民主政治和系统设计 95 | 96 | > 概念的完整性: 97 | > 98 | > 在系统设计中,概念完整性应该是最重要的考虑因素,也就是说,为了反映一系列连贯的设计思路,宁可省略一些不规则的考虑特性和改进,也不提倡独立和无法整合的系统,哪怕它们其实包含着许多很好的设计。 99 | 100 | P42 101 | 102 | 简单来说,秀技一时爽,整合火葬场。 103 | 104 | 软件工程开发不是一个人的事情,需要更多考虑工程的可持续性和统一性,以及长期可维护性。 105 | 106 | 切忌不能为了个人喜好,而加入一些自己觉得很 cool 的东西。这会导致不同系统在整合的时候,遇见极为复杂的问题。 107 | 108 | --- 109 | 110 | > 概念的完整性要求设计必须由一个人,或者非常少数互有默契的人员来实现。 111 | > 112 | > 系统的概念完整性,决定了其使用的容易程度,不能与系统基本概念进行整合的良好想法和特色,最好放到一边,不予考虑。但如果出现了很多非常重要但不兼容的构想,就应该考虑抛弃原来的设计,对不同基本概念进行合并,在合并后的系统上重新开始。 113 | 114 | P44 115 | 116 | 在软件开发领域,民主应该是位于受限范围内的。 117 | 118 | 具体来说,某些基础性的概念,如代码规范、接口规范、使用的基本框架和库等,应该是统一的(即专制),而在具体某个功能的实现上,可以允许民主,各人找到合适的开发方式。 119 | 120 | 也就是所谓的,戴着镣铐跳舞。 121 | 122 | ### 第五章节:画蛇添足 123 | 124 | > 对于系统设计师来说,一种普遍的倾向是过分地设计系统,向系统添加很多修饰功能和想法。 125 | 126 | P55 127 | 128 | 简单来说,需求负责人、产品经理、架构师以及软件开发人员,他们往往会进入一个误区,就是过度设计。 129 | 130 | 也就是说,设计了很多功能,耗费了很多工时,但实际上,相关人员使用的并不多(并且这个功能不一定是甲方提出的要求)。 131 | 132 | 解决方案其实很简单,做一个日志系统,用于记录用户对页面的访问量,以及对功能的使用率。并且以数据作为依据,提供给用户作为参考。减少用户浪费的金钱和时间,并把节约的时间,用在开发更有意义的功能上。 133 | 134 | --- 135 | 136 | ### 第六章节:贯彻执行 137 | 138 | > 对于在整个设计中,保证这些看似琐碎的问题处理原则的一致性,绝对不是一件无关紧要的事情。 139 | 140 | P63 141 | 142 | 这里的所谓的琐碎问题,指的是前文中提到的一些看似不重要的问题。例如,每次操作后,如何设置返回的条件吗。(可以理解为前后端交互时,异步请求返回的数据格式,是否格式统一) 143 | 144 | 这些问题看似没什么,也是很简单琐碎的事情。但若不统一规范,将带来额外的沟通成本,也容易产生一些无谓的 bug。无数个这样的小问题积累起来,带来的后果会超出预料的。 145 | 146 | 所以一般要统一规范,以前后端交互来说,当返回请求结果时,应该调用封装好的方法,将结果返回给用户。如此可以确保返回数据的统一。 147 | 148 | --- 149 | 150 | > 无需多说,会议是必要的。然而,数百人在场的大型磋商会议往往需要大规模和非常正式地召集。因此,我们把会议分为两个级别:周例会和年度大会——这实际上是一种非常有效的方式。 151 | > 152 | > (略)(周例会中),如果达成了共识,非常好;如果没有,则由首席架构师来决定。这需要花费时间,最终所发布的结论是正式和果断的。 153 | > 154 | > 周例会的决策会给出迅捷的结论,使工作继续开展下去。 155 | > 156 | > (略)(5)明确地授予首席架构师决策的权力,避免了妥协和拖延。 157 | 158 | P66 159 | 160 | 原文里指的大型会议是数百人级别的,然而我们并不会去做这种需要几百人共同协作的软件开发。 161 | 162 | 对我们来说,更适用的是第二段所提到的周例会,从几个人到十几个人的单个小组,到几十人的跨部门小组协同开发时,需要举办的李慧。 163 | 164 | 周例会负责抛出问题,然后达成一致(或者由负责人定下一致的解决方案),然后解决问题,减少沟通成本。 165 | 166 | --- 167 | 168 | > 电话日志: 169 | > 170 | > 对于存有疑问的实现人员,应鼓励他们打电话询问相应的架构师,而不是一边猜测一边工作。这是一个很基本的措施。(略) 171 | > 172 | > 一种有用的机制是,由架构师保存电话日志。日志中,记录了每一个问题和相应的回答。 173 | 174 | P68~P69 175 | 176 | 本文初版比较久远。现在取代电话日志的是邮件日志。也就是说,对于一些问题,应该由邮件提出来,并通过邮件正式的回答。 177 | 178 | 邮件的机制有几个好处: 179 | 180 | 1. 更正式,避免不停的变动导致带来的额外开发时间; 181 | 2. 每个人都应该对自己提出的问题和做出的解答负责,减少了撕逼扯皮的成本; 182 | 3. 可以存档,可以过一段时间回来查询当时的反馈是什么; 183 | 184 | 所以推荐对于简单问题,电话、钉钉、微信或者 QQ 沟通。 185 | 186 | 而对于复杂,又可能产生撕逼扯皮的问题,应该以邮件形式进行沟通,并抄送给相关负责人员,作为留存依据,降低沟通成本。 187 | -------------------------------------------------------------------------------- /世界各国中英文名对照.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'Afghanistan': '阿富汗', 3 | 'Angola': '安哥拉', 4 | 'Albania': '阿尔巴尼亚', 5 | 'United Arab Emirates': '阿联酋', 6 | 'Argentina': '阿根廷', 7 | 'Armenia': '亚美尼亚', 8 | 'French Southern and Antarctic Lands': '法属南半球和南极领地', 9 | 'Australia': '澳大利亚', 10 | 'Austria': '奥地利', 11 | 'Azerbaijan': '阿塞拜疆', 12 | 'Burundi': '布隆迪', 13 | 'Belgium': '比利时', 14 | 'Benin': '贝宁', 15 | 'Burkina Faso': '布基纳法索', 16 | 'Bangladesh': '孟加拉国', 17 | 'Bulgaria': '保加利亚', 18 | 'The Bahamas': '巴哈马', 19 | 'Bosnia and Herzegovina': '波斯尼亚和黑塞哥维那', 20 | 'Belarus': '白俄罗斯', 21 | 'Belize': '伯利兹', 22 | 'Bermuda': '百慕大', 23 | 'Bolivia': '玻利维亚', 24 | 'Brazil': '巴西', 25 | 'Brunei': '文莱', 26 | 'Bhutan': '不丹', 27 | 'Botswana': '博茨瓦纳', 28 | 'Central African Republic': '中非共和国', 29 | 'Canada': '加拿大', 30 | 'Switzerland': '瑞士', 31 | 'Chile': '智利', 32 | 'China': '中国', 33 | 'Ivory Coast': '象牙海岸', 34 | 'Cameroon': '喀麦隆', 35 | 'Democratic Republic of the Congo': '刚果民主共和国', 36 | 'Republic of the Congo': '刚果共和国', 37 | 'Colombia': '哥伦比亚', 38 | 'Costa Rica': '哥斯达黎加', 39 | 'Cuba': '古巴', 40 | 'Northern Cyprus': '北塞浦路斯', 41 | 'Cyprus': '塞浦路斯', 42 | 'Czech Republic': '捷克', 43 | 'Germany': '德国', 44 | 'Djibouti': '吉布提', 45 | 'Denmark': '丹麦', 46 | 'Dominican Republic': '多明尼加共和国', 47 | 'Algeria': '阿尔及利亚', 48 | 'Ecuador': '厄瓜多尔', 49 | 'Egypt': '埃及', 50 | 'Eritrea': '厄立特里亚', 51 | 'Spain': '西班牙', 52 | 'Estonia': '爱沙尼亚', 53 | 'Ethiopia': '埃塞俄比亚', 54 | 'Finland': '芬兰', 55 | 'Fiji': '斐', 56 | 'Falkland Islands': '福克兰群岛', 57 | 'France': '法国', 58 | 'Gabon': '加蓬', 59 | 'United Kingdom': '英国', 60 | 'Georgia': '格鲁吉亚', 61 | 'Ghana': '加纳', 62 | 'Guinea': '几内亚', 63 | 'Gambia': '冈比亚', 64 | 'Guinea Bissau': '几内亚比绍', 65 | 'Equatorial Guinea': '赤道几内亚', 66 | 'Greece': '希腊', 67 | 'Greenland': '格陵兰', 68 | 'Guatemala': '危地马拉', 69 | 'French Guiana': '法属圭亚那', 70 | 'Guyana': '圭亚那', 71 | 'Honduras': '洪都拉斯', 72 | 'Croatia': '克罗地亚', 73 | 'Haiti': '海地', 74 | 'Hungary': '匈牙利', 75 | 'Indonesia': '印度尼西亚', 76 | 'India': '印度', 77 | 'Ireland': '爱尔兰', 78 | 'Iran': '伊朗', 79 | 'Iraq': '伊拉克', 80 | 'Iceland': '冰岛', 81 | 'Israel': '以色列', 82 | 'Italy': '意大利', 83 | 'Jamaica': '牙买加', 84 | 'Jordan': '约旦', 85 | 'Japan': '日本', 86 | 'Kazakhstan': '哈萨克斯坦', 87 | 'Kenya': '肯尼亚', 88 | 'Kyrgyzstan': '吉尔吉斯斯坦', 89 | 'Cambodia': '柬埔寨', 90 | 'South Korea': '韩国', 91 | 'Kosovo': '科索沃', 92 | 'Kuwait': '科威特', 93 | 'Laos': '老挝', 94 | 'Lebanon': '黎巴嫩', 95 | 'Liberia': '利比里亚', 96 | 'Libya': '利比亚', 97 | 'Sri Lanka': '斯里兰卡', 98 | 'Lesotho': '莱索托', 99 | 'Lithuania': '立陶宛', 100 | 'Luxembourg': '卢森堡', 101 | 'Latvia': '拉脱维亚', 102 | 'Morocco': '摩洛哥', 103 | 'Moldova': '摩尔多瓦', 104 | 'Madagascar': '马达加斯加', 105 | 'Mexico': '墨西哥', 106 | 'Macedonia': '马其顿', 107 | 'Mali': '马里', 108 | 'Myanmar': '缅甸', 109 | 'Montenegro': '黑山', 110 | 'Mongolia': '蒙古', 111 | 'Mozambique': '莫桑比克', 112 | 'Mauritania': '毛里塔尼亚', 113 | 'Malawi': '马拉维', 114 | 'Malaysia': '马来西亚', 115 | 'Namibia': '纳米比亚', 116 | 'New Caledonia': '新喀里多尼亚', 117 | 'Niger': '尼日尔', 118 | 'Nigeria': '尼日利亚', 119 | 'Nicaragua': '尼加拉瓜', 120 | 'Netherlands': '荷兰', 121 | 'Norway': '挪威', 122 | 'Nepal': '尼泊尔', 123 | 'New Zealand': '新西兰', 124 | 'Oman': '阿曼', 125 | 'Pakistan': '巴基斯坦', 126 | 'Panama': '巴拿马', 127 | 'Peru': '秘鲁', 128 | 'Philippines': '菲律宾', 129 | 'Papua New Guinea': '巴布亚新几内亚', 130 | 'Poland': '波兰', 131 | 'Puerto Rico': '波多黎各', 132 | 'North Korea': '朝鲜', 133 | 'Portugal': '葡萄牙', 134 | 'Paraguay': '巴拉圭', 135 | 'Qatar': '卡塔尔', 136 | 'Romania': '罗马尼亚', 137 | 'Russia': '俄罗斯', 138 | 'Rwanda': '卢旺达', 139 | 'Western Sahara': '西撒哈拉', 140 | 'Saudi Arabia': '沙特阿拉伯', 141 | 'Sudan': '苏丹', 142 | 'South Sudan': '南苏丹', 143 | 'Senegal': '塞内加尔', 144 | 'Solomon Islands': '所罗门群岛', 145 | 'Sierra Leone': '塞拉利昂', 146 | 'El Salvador': '萨尔瓦多', 147 | 'Somaliland': '索马里兰', 148 | 'Somalia': '索马里', 149 | 'Republic of Serbia': '塞尔维亚共和国', 150 | 'Suriname': '苏里南', 151 | 'Slovakia': '斯洛伐克', 152 | 'Slovenia': '斯洛文尼亚', 153 | 'Sweden': '瑞典', 154 | 'Swaziland': '斯威士兰', 155 | 'Syria': '叙利亚', 156 | 'Chad': '乍得', 157 | 'Togo': '多哥', 158 | 'Thailand': '泰国', 159 | 'Tajikistan': '塔吉克斯坦', 160 | 'Turkmenistan': '土库曼斯坦', 161 | 'East Timor': '东帝汶', 162 | 'Trinidad and Tobago': '特立尼达和多巴哥', 163 | 'Tunisia': '突尼斯', 164 | 'Turkey': '土耳其', 165 | 'United Republic of Tanzania': '坦桑尼亚联合共和国', 166 | 'Uganda': '乌干达', 167 | 'Ukraine': '乌克兰', 168 | 'Uruguay': '乌拉圭', 169 | 'United States of America': '美国', 170 | 'Uzbekistan': '乌兹别克斯坦', 171 | 'Venezuela': '委内瑞拉', 172 | 'Vietnam': '越南', 173 | 'Vanuatu': '瓦努阿图', 174 | 'West Bank': '西岸', 175 | 'Yemen': '也门', 176 | 'South Africa': '南非', 177 | 'Zambia': '赞比亚', 178 | 'Zimbabwe': '津巴布韦', 179 | 'Republic of Singapore': '新加坡', 180 | 'Taiwan': '中国台湾', 181 | 'Hong Kong': '中国香港' 182 | } 183 | -------------------------------------------------------------------------------- /写一个web版的360工具箱.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/写一个web版的360工具箱.docx -------------------------------------------------------------------------------- /前端架构详谈(1)纯前端发布/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/前端架构详谈(1)纯前端发布/01.png -------------------------------------------------------------------------------- /前端架构详谈(1)纯前端发布/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/前端架构详谈(1)纯前端发布/02.png -------------------------------------------------------------------------------- /前端架构详谈(1)纯前端发布/readme.md: -------------------------------------------------------------------------------- 1 | # 前端架构详谈(1)纯前端发布 2 | 3 | * 0、前言 4 | * 1、项目简述 5 | * 2、场景描述 6 | * 3、数据结构简述 7 | * 4、项目核心点 8 | * 5、后台服务 9 | * 6、项目架构图 10 | * 7、数据库设计 11 | * 8、后期功能扩展 12 | * 9、示例效果 13 | * 10、总结 14 | 15 | ## 0、前言 16 | 17 | 在上一篇文章《大型项目前端架构浅谈》里,我简单的阐述了一下在大型项目里,前端架构如何设计。 18 | 19 | 有很多同学反映,说谈的比较浅。但由于篇幅所限,尽管已经写了8000字,但想每个都深入下去,实在是不太可能。 20 | 21 | 因此便有了这个续篇。 22 | 23 | 我考虑了一下,续篇的第一文,将优先深入阐述【2.4、纯前端版本发布】这一小结。 24 | 25 | 原内容如下: 26 | 27 | ``` 28 | 2.4、纯前端版本发布 29 | 纯前端版本发布分为两步: 30 | 31 | * 前端发布到生产环境——此时可以通过外网链接加正确的版本号访问到新版本的代码,但页面上的资源还是旧版本; 32 | 33 | * 前端通过配置工具(或者是直接更新html文件),将html中引入的资源,改为新版本。 34 | 35 | 解决的问题是:当前端需要发布新版本时,可以不依赖于后端(根据实际情况,也可以不依赖于运维)。毕竟有很多需求并不需要后端介入,单纯改个前端版本后就要后端发布一次,显然是一件非常麻烦的事情。 36 | 37 | 这个需要专门的工具,用于配置版本发布,我最近就在写这个。 38 | 39 | 意义: 40 | 41 | 提高发布效率,降低发布带来的人员时间损耗(这些都是钱),也可以在前端版本回滚的时候,速度更快。 42 | ``` 43 | 44 | ## 1、项目简述 45 | 46 | 当前常见场景为:前端的版本,写死在后端渲染的页面中(或者写死在html静态页面中)。 47 | 48 | 这带来一个问题,当前端需要发布版本时,要么重新发布静态页面(依赖使用静态页面),要么需要后端来发布。 49 | 50 | * 前者不利于后端使用页面渲染相关的中间件,比如 csrf 处理中,有一种方法就需要将 csrf-token 写入到页面中,又或者是国际化,将国际化内容直接写入到页面里; 51 | * 后者显而易见,后端发布是一件很麻烦的事情; 52 | 53 |
54 | 因此,我们期望实际场景中是这样一个形式(如下图): 55 | 56 | 57 | 58 | 通过实现这样的流程,后端开发者可以在页面里订阅资源的版本号,并将其值写入页面进行渲染。 59 | 60 | 而前端开发者可以实现: 61 | 62 | * 独立发布(通过管理页面提交最新的版本号,一次配置后无需依赖后端); 63 | * 提高前后端分离程度和可配置化能力; 64 | * 遇见前端bug时,通过在线快速发布新版本或回滚到旧版本来修复bug的能力; 65 | 66 | 67 | ## 2、场景描述 68 | 69 | 在前端领域中,常见的前端资源命名,有三种方式: 70 | 71 | 1. 名字不变:如/js/app.js 72 | 2. hash名,每次发布是新的hash:如/js/app.r324wf1.js 73 | 3. 带版本号的名字:如/0.1.0/js/app.js 74 | 75 |
76 | 前端发布资源时,也有两种方式: 77 | 78 | 1. html完全由前端管理,前端发布的时候会有html文件,webpack打包时自动在html里写文件名; 79 | 2. html由后端管理(服务器渲染),前端只负责发布js、css等资源文件。在前端发布之后,后端修改版本号再发布; 80 | 81 | 82 | 目前比较好的解决方案是 第三种命名方式第二种发布方式,优点: 83 | 84 | 1. 版本管理清楚明确; 85 | 2. 版本发布后,当前分支自动锁死(不可修改),避免覆盖发布导致的bug; 86 | 3. 后端控制视图(html)能实现的功能更强(比如通过中间件在所有view里插入一些内容); 87 | 88 | 实际场景对比: 89 | 90 | 【常规方式】 91 | 92 | 1. 假如html后端管理,html上有一个js资源加载,链接为: 93 | 2. 发布后,发现1.1.10版本的前端页面存在一个bug,于是快速修复,发布1.1.11版本; 94 | 3. 如果需要修复这个bug,那么需要后端开发将html里的 1.1.10 修改为 1.1.11,然后再发布一次版本。缺点是后端发布毫无疑问是很麻烦的一件事情。 95 | 96 |
97 | 【应用本项目后的解决方案】 98 | 99 | 1. 配置key-value系统,key为version,value默认配置为1.1.10,html的资源加载写为: 100 | 2. 第二步不变,前端发布修复了bug的1.1.11版本; 101 | 3. 在系统里更新配置,将key=version的value,更新为1.1.11; 102 | 4. 后端开发不需要做任何工作,Server在请求时,检测到version这个key的value过期(默认每个key都有过期时间,例如5秒),因此重新读取MySQL或Redis里key=version的value值。并将version的值更新为1.1.11; 103 | 5. 因此线上资源加载的真实资源从1.1.10变为1.1.11; 104 | 105 | 其他应用场景: 106 | 107 | 1. 页面中的通知信息:比如说,页面内嵌一个消息框是系统通知,这个通知可能会变,每次手动改通知的话就比较麻烦。写运营配置工具又浪费时间,可以通过这种配置来实现。 108 | 2. 其他需要返回数据是可配置的场景; 109 | 110 | ## 3、数据结构简述 111 | 112 | 1. 应用-Key两级结构:为了方便管理,每个用户都可以创建应用,并在应用下创建Key(即Key属于应用)。 113 | 2. Key-value系统:key需要注册,每个key都有value存在。使用时,通过key可以获取key对应的value,方便管理。 114 | 3. Key的新增/编辑(前端):通过专门的管理页面,使用者可以将key-value写入MySQL,每一次编辑都应有历史记录; 115 | 4. 权限管理:普通用户,只能创建有限数量个(如0~3个)应用,但可以获得其他应用的管理权限;管理员用户可以查看/编辑/删除所有的应用和其所属的key-value; 116 | 5. value的获取(后端):server注册绑定key,绑定后会定时从Redis或MySQL同步value到本机缓存,以确保本机的缓存是最新的。在渲染页面时,可以实时获取key对应的value(这一步是同步的) 117 | 118 | 119 | ## 4、项目核心点 120 | 121 | ### 1、Server-Redis-MySQL三层结构: 122 | 123 | 之所以设计三层结构: 124 | 125 | * 一是因为Redis这么fashion又好用的东西,能不上嘛; 126 | * 二是加入Redis可以作为缓存,减少MySQL的读写压力(Redis的并发量更大),以及确保一致性(数据优先从MySQL读); 127 | * 三对分布式应用更友好; 128 | 129 | ### 2、Server取value值: 130 | 131 | 功能说明: 132 | 133 | 1. 需要配置该key的默认值,默认值将定期从Redis或者MySQL读取并更新; 134 | 2. 每次渲染的时候,默认从本机缓存取(确保不影响渲染速度),获取的是默认值; 135 | 3. 如果本机缓存的默认值过期,则从Redis获取,然后写入本机缓存(减少MySQL压力); 136 | 4. 如果Redis也不存在(过期),则从MySQL读取,然后写入Redis和本机缓存; 137 | 5. 本机缓存存在过期时间(默认10秒),过期后,则从Redis读取并更新本机缓存; 138 | 6. Redis的数据存在过期时间(默认600秒),过期后,下次获取的时候,会被写入最新的数据; 139 | 7. 可以强制获取MySQL的数据,用于更新Redis的缓存; 140 | 141 |
142 | 异常处理: 143 | 144 | * 【1】当无法从Redis取到值,则取默认值; 145 | * 【2】当无法连接Redis,将重试一次,如果重试失败,则取默认值; 146 | * 【3】当无法连接MySQL,重试一次,重试失败,则取默认值; 147 | 148 |
149 | 可能存在的问题: 150 | 151 | 【1】后进先出问题: 152 | 153 | Server无法从Redis读取值时(值过期),读取MySQL,此时值记为(A)。 154 | 155 | 在写入Redis之前,用户提交版本号到MySQL(此时值记为B)。 156 | 157 | 若用户提交的B,先写入Redis(B),然后Server从MySQL读取的旧值再写入Redis(A)。 158 | 159 | 此时,Redis的值是旧值(A),而不是新值(B)。 160 | 161 | 将在600秒后(在Redis中配置的默认过期时间),Redis缓存过期后,才会读取新值。 162 | 163 | ### 3、用户新建、更新key-value 164 | 165 | 功能说明: 166 | 167 | 1. 用户先登录,登录后可以查看自己管理的所有应用和该应用下的key(读取自MySQL); 168 | 2. 用户可以新建key,填写对应的value,保存后保存到MySQL,然后再更新到Redis; 169 | 3. 编辑Key时,从MySQL读取,保存时,更新到MySQL和Redis; 170 | 4. 删除Key时,从MySQL标记为删除(而不是真的删除),并删除Redis的缓存(慎重,危险操作,额外提示); 171 | 172 | 173 | ## 5、后台服务 174 | 175 | 1. Nginx服务:反向代理,将用户访问指向后台服务器,为后期负载均衡扩展做准备。 176 | 2. Server应用:正常的后台应用,会渲染页面。 177 | 3. Redis:MySQL的缓存 178 | 4. MySQL:版本管理数据将存在这里。 179 | 5. 版本管理前台:登录、新增、编辑、删除应用和key时在这里。 180 | 181 | ## 6、项目架构图 182 | 183 | 如下图: 184 | 185 | 186 | 187 | ## 7、数据库设计 188 | 189 | 1、database名:version_controller 190 | 191 | 2、用户表:(表名developer_info) 192 | 193 | 表结构和源代码略 194 | 195 | 3、应用表:(表名app) 196 | 197 | 略 198 | 199 | 4、key-value表:(表名key_value) 200 | 201 | 略 202 | 203 | 5、权限管理sql 204 | 205 | 略 206 | 207 | ## 8、后期功能扩展 208 | 209 | 1. 可以通过比如QQ机器人等,通过key查看key-value,甚至编辑key-value; 210 | 2. key-value更新后,向有编辑权限的用户和创建者,推送邮件告知; 211 | 3. 提交key值的更新后,增加审批流程; 212 | 213 | ## 9、示例效果 214 | 215 | 后端动态渲染页面: 216 | 217 | http://119.3.214.234:6644/ 218 | 219 | 管理页面(新增、编辑应用/key):(账号和密码都是12345678) 220 | 221 | http://119.3.214.234:7789/ 222 | 223 | python端使用该应用的package: 224 | 225 | https://github.com/qq20004604/kv-manager 226 | 227 | ## 10、总结 228 | 229 | 由于时间和精力所限,我给了一个包含了主要功能的DEMO,具体的细节并不完善,请见谅。 230 | 231 | 关键的数据库设计和后台管理页面的代码,由于有其他用处,所以没有开源,但功能描述已经在上面写的很清楚了。 232 | 233 | 想要深入讨论的,可以加我的微信:qq20004604 234 | 235 | 顺便问一下,西安有没有能给15k每月,年薪20w以上的国企? 236 | 237 | end~ -------------------------------------------------------------------------------- /原生JavaScript.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/原生JavaScript.docx -------------------------------------------------------------------------------- /台式电脑候选.md: -------------------------------------------------------------------------------- 1 | 前注: 2 | 3 | 价格主要取自京东,买的时候个人觉得可以和品牌供货商谈。 4 | 5 | 对电脑配置不太熟悉的话,可以看每一款配置最后的优缺点评价和综合点评。 6 | 7 | --- 8 | 9 | 1、戴尔(DELL)成就5090 10 | 11 | 参考链接: 12 | 13 | https://item.jd.com/100007412752.html#crumb-wrap 14 | 15 | 价格: 16 | 17 | 京东:6999(含 23.8 英寸显示器)6289(不含显示器) 18 | 19 | 配置: 20 | 21 | * 英特尔 9 代 i7 八核 CPU(i7-9700)(性能大概是同价位笔记本的 2 倍); 22 | * 16G 内存; 23 | * 512g ssd 硬盘(高性能硬盘); 24 | * 可选配显示器(价格见上面); 25 | 26 | 优点: 27 | 28 | * 可直接配显示器,无需额外采购; 29 | * 性价比很高,高性能 CPU、大内存可以满足日常开发需求; 30 | * 高速 ssd 硬盘可以提高开发人员的开发需求; 31 | * 缩减了显卡的配置,降低了价格; 32 | 33 | 综合点评: 34 | 35 | cpu、内存和硬盘的配置都不错,足够满足研发需要。还可以选配显示器,节省采购精力。 36 | 37 | --- 38 | 39 | 2、联想(Lenovo)拯救者刃7000 40 | 41 | 参考链接: 42 | 43 | https://item.jd.com/100004096481.html#crumb-wrap 44 | 45 | 价格: 46 | 47 | 京东:7989(不含显示器) 48 | 49 | 配置: 50 | 51 | * 英特尔 9 代 i9 cpu(i9-9900); 52 | * 16G 内存; 53 | * 512g ssd 固态硬盘(高性能硬盘); 54 | 55 | 优点: 56 | 57 | * cpu 比 1# 更好,大约高 20% 左右; 58 | * 同样的大内存和高性能 ssd 硬盘; 59 | * 优秀的显卡,适合做深度学习、AI 等相关领域的研发工作; 60 | * 联想,传统国企采购品牌; 61 | * 谁要说这个电脑性能不行,就应该打屁股咯; 62 | 63 | 综合点评: 64 | 65 | 比 1# 推荐更优秀的 cpu 和显卡,提供了更优秀的机器性能,可以提高研发人员的工作效率。 66 | 67 | 需要额外采购显示器。 68 | 69 | --- 70 | 71 | 3、惠普(HP)战99商用办公台式电脑主机 72 | 73 | 参考链接: 74 | 75 | https://item.jd.com/100006246826.html#crumb-wrap 76 | 77 | 参考价格: 78 | 79 | 京东:5999(无显示器) 80 | 81 | 配置: 82 | 83 | * 英特尔 9 代 i7 cpu(i7-9700) 84 | * 16g 内存 85 | * 2TB 机械硬盘 + 256g SSD 硬盘; 86 | 87 | 优点: 88 | 89 | * cpu 水平足够; 90 | * 内存可以满足研发需求; 91 | * 便宜; 92 | * 内置无线网卡,不需要网线也能上网; 93 | 94 | 综合评价: 95 | 96 | 三款里最便宜的,性能也足够满足一般研发需要。 97 | 98 | 缺点是不适合做有显卡性能要求的研发工作。另外惠普虽然是大公司,但是美国公司。 99 | 100 | --- 101 | 102 | 以下是显示器推荐 103 | 104 | --- 105 | 106 | 4、飞利浦 31.5英寸 2K QHD高分辨率 显示器 107 | 108 | 参考链接: 109 | 110 | https://item.jd.com/5918529.html 111 | 112 | 参考价格: 113 | 114 | 京东:1199 115 | 116 | 配置: 117 | 118 | * 2560x1440 分辨率(2k 分辨率); 119 | * 60HZ 刷新率; 120 | 121 | 优点: 122 | 123 | * 更大的分辨率,适合前端、设计同学使用; 124 | 125 | 综合评价: 126 | 127 | 由于前端和设计同学,对屏幕分辩率要求比较高,因此推荐这一款,是 2k 分辨率里最便宜的了。 128 | 129 | 5、三星(SAMSUNG)23.8英寸 显示器 130 | 131 | 参考链接: 132 | 133 | https://item.jd.com/100007193438.html 134 | 135 | 参考价格: 136 | 137 | 京东:769 138 | 139 | 配置: 140 | 141 | * 1920x1080 分辨率(1080P); 142 | * 75HZ 刷新率; 143 | 144 | 优点: 145 | 146 | * 刷新率更高,屏幕也还可以,对眼睛的伤害更低; 147 | 148 | 综合评价: 149 | 150 | 常规 1080p 显示器,屏幕比较好,对于需要常年坐在电脑前的研发同学来说,对眼睛的伤害会小一些。 151 | 152 | 价格在同样的 1080p 显示器里,中规中矩一些。 153 | 154 | 6、戴尔(DELL)D2720DS 27英寸 2K高清 三面微边框 旋转升降 专业设计绘图 155 | 156 | 参考链接: 157 | 158 | https://item.jd.com/100006246946.html#crumb-wrap 159 | 160 | 参考价格: 161 | 162 | 京东:1499 163 | 164 | 配置: 165 | 166 | * 2560x1440 分辨率(2K); 167 | * 60HZ 刷新率; 168 | 169 | 优点: 170 | 171 | * 戴尔,品质保证; 172 | * 可以旋转屏幕,比如变为竖屏,对于研发同学来说非常友好; 173 | * 非常好的屏幕; 174 | * 公司现在用的就是戴尔的显示器; 175 | 176 | 综合评价: 177 | 178 | 预算充足的话,我推荐这款。 179 | -------------------------------------------------------------------------------- /大型项目前端架构浅谈.md: -------------------------------------------------------------------------------- 1 |

大型项目前端架构浅谈

2 | 3 | 目录: 4 | 5 | * 1、综合 6 | * 1.1、使用场景 7 | * 1.2、核心思想 8 | * 1.3、切入角度 9 | * 1.4、其他 10 | * 2、基础层设计 11 | * 2.1、自建Gitlab 12 | * 2.2、版本管理 13 | * 2.3、自动编译发布Jenkins 14 | * 2.4、纯前端版本发布 15 | * 2.5、统一脚手架 16 | * 2.6、Node中间层 17 | * 2.7、埋点系统 18 | * 2.8、监控和报警系统 19 | * 2.9、安全管理 20 | * 2.10、Eslint 21 | * 2.11、灰度发布 22 | * 2.12、前后端分离 23 | * 2.13、Mock 24 | * 2.14、定期备份 25 | * 3、应用层设计 26 | * 3.1、多页和单页 27 | * 3.2、以应用为单位划分前端项目 28 | * 3.3、基础组件库的建设 29 | * 3.4、技术栈统一 30 | * 3.5、浏览器兼容 31 | * 3.6、内容平台建设 32 | * 3.7、权限管理平台 33 | * 3.8、登录系统设计(单点登录) 34 | * 3.9、CDN 35 | * 3.10、负载均衡 36 | * 3.11、多端共用一套接口 37 | * 3.12、流量峰值保障 38 | * 4、总结 39 | 40 |

1、综合

41 | 42 | 我在2年之前,写过一篇中小型项目的前端架构浅谈。随着能力的上升,以及在阿里巴巴工作过,是时候写一篇大型项目的前端架构分析了。 43 | 44 | 本篇文章不会更多侧重于具体技术实现,而是尝试从更高角度出发,分析为什么要这么做,这些设计能解决什么问题,成本和收益如何。 45 | 46 | 由于作者能力有限,可能会有所缺漏或者部分错误,欢迎读者指出。 47 | 48 |

1.1、适用场景:

49 | 50 | 本篇文章,适用于单个/多个大型项目、拥有超过10个以上的前端开发的场景。 51 | 52 | 前端项目的规模不同,成本收益比也会有所差别。通常来说,人员越多、项目复杂度越高,那么收益/成本的比值越大。 53 | 54 | 对于人数较少、项目简单的开发团队,可能有部分措施不适用,因此应该根据具体情况来选用。 55 | 56 |

1.2、核心思想:

57 | 58 | 【1】解决问题:前端架构的设计,应是用于解决已存在或者未来可能发生的技术问题,增加项目的可管理性、稳定性、可扩展性。 59 | 60 | 【2】人效比:对于需要额外开发工作量的事务(本文中存在一些需要一定开发量的内容),我们在决定是否去做的时候,应该考虑到两个要素:第一个是花费的人力成本,第二个是未来可能节约的时间和金钱、避免的项目风险与资损、提高对业务的支撑能力以带来在业务上可衡量的更高的价值、以及其他价值。 61 | 62 | 【3】定性和定量:架构里设计的内容,一定要有是可衡量的意义的,最好是可以定量的——即可以衡量带来的收益或减少的成本,至少是可以定性的——即虽然无法用数字阐述收益,但我们可以明确这个是有意义的,例如增加安全性降低风险。 63 | 64 | 【4】数据敏感:专门写这一条强调数据作为依据的重要性。当我们需要说服其他部门/上级管理者,以推动我们设计的内容时,只有数据——特别是跟钱有关的数据,才是最有说服力的证明。 65 | 66 | 由于篇幅所限,本文很难直接给出定量的值,因此建议架构设计者,先确保项目中设计使用2.7里的埋点系统,根据埋点系统获取的数据,对项目效果进行定量分析,并以此写成PPT和其他部门/上级管理者进行协调。 67 | 68 | 69 |

1.3、切入角度:

70 | 71 | 分为基础层和应用层。 72 | 73 | 基础层偏基础设施建设,与业务相关性较低。 74 | 75 | 应用层更贴近用户,用于解决某一个问题。 76 | 77 | 部分两个都沾边的,根据经验划分到其中一个。 78 | 79 |

1.4、其他

80 | 81 | 由于已经谈到架构层级,因此很多内容,并不仅仅只属于前端领域,有很多内容是复合领域(前端、后端、运维、测试),因此需要负责架构的人,技术栈足够全面,对未来发展有足够的前瞻性。 82 | 83 | 文章的内容结构为:【项目】—>【解决的问题和带来的好处】—>【项目的实际意义】 84 | 85 |

2、基础层设计

86 | 87 |

2.1、自建Gitlab

88 | 89 | 这个是基础的基础了。本不应该提的,不过考虑到我最近面试的几家公司,有的公司(人数并不少)并没有使用Gitlab,因此专门提一下,并且使用这个的难度非常低。 90 | 91 | 强烈建议使用Gitlab进行版本管理,自建Gitlab难度并不大,方便管理,包括代码管理、权限管理、提交日志查询,以及联动一些第三方插件。 92 | 93 | 意义: 94 | 95 | 公司代码是公司的重要资产,使用自建Gitlab可以有效保护公司资产。 96 | 97 |

2.2、版本管理

98 | 99 | 版本管理的几个关键点: 100 | 101 | 112 | 113 | 意义: 114 | 115 | 提高项目的可控性。 116 | 117 |

2.3、自动编译发布Jenkins

118 | 119 | 这个工具用于在代码发布后,执行一系列流程,例如自动编译打包合并,然后再从Gitlab发布到CDN或者静态资源服务器。 120 | 121 | 使用这个工具,可以让一般研发人员不关心代码传到Gitlab后会发生什么事情,只需要专心于开发就可以了。 122 | 123 | 意义: 124 | 125 | 让研发人员专心于研发,和环境、运维等事情脱钩。 126 | 127 |

2.4、纯前端版本发布

128 | 129 | 纯前端版本发布分为两步: 130 | 131 | 139 | 140 | 解决的问题是:当前端需要发布新版本时,可以不依赖于后端(根据实际情况,也可以不依赖于运维)。毕竟有很多需求并不需要后端介入,单纯改个前端版本后就要后端发布一次,显然是一件非常麻烦的事情。 141 | 142 | 这个需要专门的工具,用于配置版本发布,我最近就在写这个。 143 | 144 | 意义: 145 | 146 | 提高发布效率,降低发布带来的人员时间损耗(这些都是钱),也可以在前端版本回滚的时候,速度更快。 147 | 148 |

2.5、统一脚手架

149 | 150 | 适用场景:有比较多独立中小项目。好处: 151 | 152 | 163 | 164 | 意义: 165 | 166 | 提高开发人员在多个项目之间的快速切换能力,提高项目可维护性,统一公司技术栈,避免因为环境不同导致奇怪的问题。 167 | 168 |

2.6、Node中间层管理

169 | 170 | 适用场景:需要SEO且前端使用React、vue,或前端介入后端逻辑,直接读取后端服务或者数据库的情况。 171 | 172 | 180 | 181 | 意义: 182 | 183 | 让前端可以侵入后端领域,质的提升对业务的支持能力。 184 | 185 |

2.7、埋点系统

186 | 187 | 强烈推荐前端做自己的埋点系统。这个不同于后端的日志系统。 188 | 189 | 前端埋点系统的好处: 190 | 191 | 205 | 206 | 埋点系统是前端高度介入业务,把握业务发展情况的一把利剑,通过这个系统,我们可以比后端更深刻的把握用户的习惯,以及给产品经理、运营等人员提供准确的数据依据。当有了数据后,前端人员就可以针对性的优化功能、布局、页面交互逻辑、用户使用流程。 207 | 208 | 埋点系统应和业务解耦,开发人员使用时注册,然后在项目中引入。然后在埋点系统里查看相关数据(例如以小时、日、周、月、年为周期查看)[原创水印-作者:零零水(王冬),微信:qq20004604]。 209 | 210 | 意义: 211 | 212 | 数据是money,数据是公司的生命线,数据是最好的武器。 213 | 214 |

2.8、监控和报警系统

215 | 216 | 监控和报警系统应基于埋点系统而建立,在如以下场景时[原创水印-作者:零零水(王冬),微信:qq20004604]触发: 217 | 218 | 232 | 233 | 建设这个系统的好处在于,提前发现一些不容易发现的bug(需要埋点做的比较扎实)。有一些线上bug,因为用户环境特殊,导致无法被开发人员和测试人员发现。但其中一部分bug又因为不涉及资金,并不会导致资损(因此也不会被后端的监控系统所发现),这样的bug非常容易影响项目里某个链路的正常使用。 234 | 235 | 意义: 236 | 237 | 提高项目的稳定性,提高对业务的把控能力。降低bug数,降低资损的可能性,提前发现某些功能的bug(在工单到来之前)。 238 | 239 |

2.9、安全管理

240 | 241 | 前端的安全管理,通常要依赖于后端,至于只跟单纯有关系的例如dom.innerHTML= 'xxx '这种太基础,就不提了。 242 | 243 | 安全管理的很难从架构设计上完全避免,但还是有一定解决方案的,常见安全问题如下: 244 | 245 | 256 | 257 | 意义: 258 | 259 | 减少安全漏洞,避免用户受到损失,避免遭遇恶意攻击,增加系统的稳定性和安全性。 260 | 261 |

2.10、Eslint

262 | 263 | Eslint的好处很多,强烈推荐使用: 264 | 265 | 276 | 277 | 总的来说,eslint推荐直接配置到脚手架之中,对我们提高代码的可维护性的帮助会很大。可以考虑在上传到gitlab时,硬性要求eslint校验,通过的才允许上传。 278 | 279 | 意义: 280 | 281 | 提高代码的可维护性,降低团队协作的成本。 282 | 283 |

2.11、灰度发布

284 | 285 | 灰度发布是大型项目在发布时的常见方法,指在发布版本时,初始情况下,只允许小比例(比如1~5%比例的用户使用),若出现问题时,可以快速回滚使用老版本,适用于主链路和访问量极大的页面。 286 | 287 | 好处有以下几点: 288 | 289 | 300 | 301 | 灰度发布通常分为多个阶段:【1】1%;【2】5~10%;【3】30~50%;【4】全量推送(100%)。灰度发布一定要允许配置某些IP/账号访问时,可以直接访问到灰度版本。 302 | 303 | 意义: 304 | 305 | 降低风险,提高发布灵活度。 306 | 307 |

2.12、前后端分离

308 | 309 | 这个并不是指常见的前后端分离,而是指在分配前后端管控的领域。 310 | 311 | 中小项目常见的情况是后端只提供接口和让某个url指向某个html,前端负责html、css、js等静态资源。 312 | 313 | 但大型项目并不建议这么做,建议前端负责除html以外的静态资源,而html交给后端处理,理由有很多: 314 | 315 | 329 | 330 | 意义: 331 | 332 | 更规范的进行页面管理,降低页面和功能的耦合度,减少复杂页面的环境配置时间。 333 | 334 |

2.13、Mock

335 | 336 | Mock也是常见前端系统之一,用于解决在后端接口未好时,生成返回的数据。 337 | 338 | 我个人不太建议开发一个专门的系统来Mock,更好的Mock手法是直接嵌入到脚手架之中。思路如下: 339 | 340 | 354 | 355 | 这种处理,可以降低mock的复杂度,随时更改mock时返回的数据,比单独开发一个mock系统性价比更高。 356 | 357 | 意义: 358 | 359 | 在前后端并行开发时,降低沟通交流成本,方便开发完毕后直接对接。 360 | 361 |

2.14、定期备份

362 | 363 | 备份是常被忽略的一件事情,但当我们遇见毁灭性场景时,缺少备份带来的损失是非常大的,常见场景: 364 | 365 | 376 | 377 | 总的来说,没人想遇见这样的场景,但我们必须考虑这种极端情况的发生,因此需要从架构层面解决这个问题。常见方法是定期备份、多机备份、容灾系统建设等。 378 | 379 | 意义: 380 | 381 | 避免在遭遇极端场景时,给公司带来不可估量的损失。 382 | 383 |

3、应用层设计

384 | 385 |

3.1、多页和单页

386 | 387 | 除了特殊场景,通常推荐使用多页架构。理由如下: 388 | 389 | 406 | 407 | 之前面试的一家,采用了单页的形式,之前因为种种原因,同时采用了ng和react。由于项目历史也比较久(3年以上),结果导致目前继续维护更新的难度很大,即使想部分重构,也很麻烦。 408 | 409 | 意义: 410 | 411 | 降低长期项目迭代维护的难度, 412 | 413 |

3.2、以应用为单位划分前端项目

414 | 415 | 在项目比较大的时候,将所有页面的前端文件放入到同一个代码仓库里,我之前参与过一家企业的前端项目开发,发现其就是这么做的。根据使用经验来看[原创水印-作者:零零水(王冬),微信:qq20004604],存在很多问题: 416 | 417 | 434 | 435 | 因此,我们应该避免这种现象的发生,个人推荐以应用为单位进行开发、发布。所谓应用即指一个业务涉及到的前后端代码,好处很多: 436 | 437 | 445 | 446 | 意义: 447 | 448 | 规范项目,增加代码的安全性,降低项目维护成本。 449 | 450 |

3.3、基础组件库的建设

451 | 452 | 这个蛮基础的,对于组件库的建设,不建议研发人员较少时去做这件事情,专职前端开发人数少于10人时,建议使用比较靠谱的第三方UI库,例如Antd,这样性价比更高。 453 | 454 | 设计基础组件库的前提,是要求统一技术栈,这样才能最大化基础组件库的效益。组件库建议以使用以下参考标准: 455 | 456 | 476 | 477 | 478 | 总的来说,建设起来后,利大于弊,但是需要专人维护,因此还是有一定成本的。 479 | 480 | 意义: 481 | 482 | 统一不同/相同产品线之间的风格,给用户更好的体验,减少单次开发中写UI组件时浪费的时间和人力,提高开发效率。 483 | 484 |

3.4、技术栈统一

485 | 486 | 前端有三大主流框架,还有兼容性最强jQuery,以及各种第三方库,UI框架。因此项目需求如果复杂一些,很容易形成一个大杂烩。因此前端的技术栈必须统一,具体来说,建议实现以下举措: 487 | 488 | 505 | 506 | 总的来说,技术栈统一的好处很多,可以有效提高开发效率,降低重复造轮子产生的成本。 507 | 508 | 意义: 509 | 510 | 方便招人,简化团队成员培养成本,以及提高项目的可持续性。 511 | 512 | 513 |

3.5、浏览器兼容

514 | 515 | 常见的问题是IE6、7、8,以及部分小众浏览器(PC和手机)产生的奇怪问题。因此应该考虑统一解决方案,避免bug的重复产生。常见解决方案有: 516 | 517 | 534 | 535 | 意义: 536 | 537 | 避免浏览器环境产生的bug,以及排查此类bug所浪费的大量时间。 538 | 539 |

3.6、内容平台建设

540 | 541 | 为了提高公司内部的沟通效率,总结经验,以及保密原因。应建设一个内部论坛+博客站点。其具备的好处如下: 542 | 543 | 560 | 561 | 众所周知,大型互联网公司通常都有这样一个内部论坛和博客站点。其降低了公司的沟通和交流成本,也增加了公司的技术积累。 562 | 563 | 意义: 564 | 565 | 博客增强技术积累,论坛增强公司内部沟通能力。 566 | 567 |

3.7、权限管理平台

568 | 569 | 当公司内部人员较多时,应有一个专门的平台,来管理、规范用户的权限以及可访问内容[原创水印-作者:零零水(王冬),微信:qq20004604]。权限管理平台有几个特点: 570 | 571 | 588 | 589 | 意义: 590 | 591 | 使得公司内部流程正规化、信息化。 592 | 593 |

3.8、登录系统设计(单点登录)

594 | 595 | 当公司内部业务线比较复杂但相互之间的耦合度比较高时,我们应该考虑设计添加单点登录系统。具体来说,用户在一处登录,即可以在任何页面访问,登出时,也同样在任何页面都失去登录状态。SSO的好处很多: 596 | 597 | 614 | 615 | 总的来说,大中型web应用,SSO可以带来很多好处,缺点却很少。 616 | 617 | 意义: 618 | 619 | 用户体验增强,打通不同业务之间的间隔,降低开发成本和用户管理成本。 620 | 621 |

3.9、CDN

622 | 623 | 前端资源的加载速度是衡量用户体验的重要指标之一。而现实中,因为种种因素,用户在加载页面资源时,会受到很多限制。因此上CDN是非常有意义的,好处如下: 624 | 625 | 642 | 643 | CDN是一种比较成熟的技术,各大云平台都有提供CDN服务,价格也不贵,因此CDN的性价比很高。 644 | 645 | 意义: 646 | 647 | 增加用户访问速度,降低网络延迟,带宽优化,减少服务器负载,增强对攻击的抵抗能力。 648 | 649 |

3.10、负载均衡

650 | 651 | 目前来看,负载均衡通常使用Nginx比较多,以前也有使用Apache。当遇见大型项目的时候,负载均衡和分布式几乎是必须的。负载均衡有以下好处: 652 | 653 | 664 | 665 | 负载均衡已经是蛮常见的技术了,好处不用多说,很容易理解。 666 | 667 | 意义: 668 | 669 | 增强业务的可用性、扩展性、稳定性,可以支持更多用户的访问。 670 | 671 |

3.11、多端共用一套接口

672 | 673 | 目前常见场景是一个业务,同时有PC页面和H5页面,由于业务是一样的,因此应避免同一个业务有多套接口分别适用于PC和H5端。[原创の水印-作者:零零水(王冬),QQ:20004604]因此解决方案如下: 674 | 675 | 686 | 687 | 多端共用接口,是减少开发工作量,并且提高业务可维护性的重要解决方案。 688 | 689 | 意义: 690 | 691 | 降低开发工作量,增强可维护性。 692 | 693 |

3.12、流量峰值保障

694 | 695 | 实际场景中,经常会遇见过高的峰值流量。具体来说,假设平时网站每秒访问量的高峰在3-4k左右。通常来说,你设计能承载每秒1w访问的Server,基本是够用的。但生活总是充满意外,假如运营搞一个秒杀活动,每秒访问量的峰值超过2w甚至更多都是有可能的,这种情况下,很容易导致连锁反应,然后服务器原地爆炸。 696 | 697 | 为了应对这种特殊情况,我们需要做一些操作(通常需要Server端介入),常见解决方式有以下几种: 698 | 699 | 707 | 708 | 总的来说,解决方法很多,架构师需要能理解整个业务模型和架构模型,才能正确对峰值流量提出有效的解决方案。 709 | 710 | 意义: 711 | 712 | 保障大促等活动,为业务的正常开展保驾护航。 713 | 714 |

4、总结

715 | 716 | 由于各个公司具体情况不同,项目也具有特殊性,因此以上设计不可强行套入,应根据自己公司规模、项目进展、人员数量等,先添加比较重要的功能和设计。并需要考虑到长期项目的可维护性和发展需要,对部分基础设施进行提前研发设计。 717 | 718 | 篇幅所限,因此无法面面俱到,只提了一些我认为比较重要的架构层面需要考虑的内容,欢迎大家补充。大家如果有自己的看法,欢迎回复,或者添加我的微信 qq20004604(昵称:零零水)进行讨论。 719 | 720 | 最后问一下,西安有没有不加班,并且需要前端架构师的公司,请联系我。 721 | -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/01.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/02.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/03.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/04.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/05.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/06.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/07.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/08.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/09.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/10.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/11.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/12.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/13.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/14.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/15.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/16.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/如何使用虚拟机来运行linux/17.jpg -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/readme.md: -------------------------------------------------------------------------------- 1 |

程序员技术交流、面试、职场、生活、游戏、相亲,综合讨论QQ群:387017550,群内经常发红包,欢迎加入

2 | 3 |

群福利:每周一次免费面试,在YY频道直播,可旁听,有往期录音

4 | 5 | ## 1、下载 6 | 7 | 虚拟机软件使用Oracle VM VirtualBox,优势是开源。 8 | 9 | 进入以下链接,然后下载: 10 | 11 | https://www.oracle.com/technetwork/cn/server-storage/virtualbox/downloads/index.html 12 | 13 | ## 2、安装 14 | 15 | 打开,安装就行,建议不要放在C盘 16 | 17 | ## 3、新建虚拟机 18 | 19 | #### 1、新建 20 | 21 | 首先打开 VirtualBox,点击新建,填写虚拟机名字,如下图: 22 | 23 | 24 | 25 | #### 2、分配内存 26 | 27 | 点击下一步,分配内存。注意尽量不要超过3GB,理由是如果超过3GB,可能会触发一个错误(解决方案参考这个链接:https://stackoverflow.com/questions/33304393/vt-x-is-disabled-in-the-bios-for-both-all-cpu-modes-verr-vmx-msr-all-vmx-disabl) 28 | 29 | 30 | 我选择分配2048MB(即2GB内存)。 31 | 32 | 33 | 34 | #### 3、虚拟硬盘 35 | 36 | 分配虚拟硬盘,推荐10GB。 37 | 38 | 39 | 40 | 使用默认选项,点击创建按钮后,出现一个新弹窗。 41 | 42 | 在新弹窗里,前2步直接点击下一步,第三步选择位置的时候,建议改一下位置(默认是在C盘),并且我将大小调整到15GB,点击创建按钮。 43 | 44 | 45 | 46 | #### 4、启动 47 | 48 | 此时创建完毕,如下图,双击启动。 49 | 50 | 51 | 52 | 但是初始情况下如下图,原因是你没有安装操作系统。这个时候我们去下载 Ubuntu 系统。 53 | 54 | 55 | 56 | ## 4、下载Ubuntu系统 57 | 58 | 打开这个网站:https://www.ubuntu.com/download/server ,然后下载LTS版本。 59 | 60 | 用虚拟机软件挂载下载的 ISO 文件,挂到某个光盘符下,然后虚拟机的启动盘也修改为同一个。 61 | 62 | ## 5、启动失败常见问题解决方案 63 | 64 | 如下图修改: 65 | 66 | 67 | 68 | 不然会报错误 ``No bootable medium found`` 69 | 70 | 如果运行的时候提示:``this kernel requires an x86-64 cpu``,说明没有启用 ``intel Virtualization Technology``,解决方案参考:https://blog.csdn.net/zhouyongku/article/details/45172897 71 | 72 | 同时,系统需要选择 64bit 的,如下图: 73 | 74 | 75 | 76 | 正常情况下,会自动触发安装,如下图 77 | 78 | 79 | 80 | ## 6、安装过程中的配置 81 | 82 | 第一步,选English,如图,接下来一路下一步,直到需要名字为止。 83 | 84 | 85 | 86 | 如图,输入名字,然后继续使用默认选项,一路下一步。 87 | 88 | 89 | 90 | 安装完成后如下图,点击 ``Reboot Now`` 启动。 91 | 92 | 93 | 94 | 重启后,会提示你移除虚拟盘片,如下图,移除后继续。 95 | 96 | 97 | 98 | ## 7、进入系统 99 | 100 | 在第七步,启动系统后,会刷出几个[OK],但是没有输入内容的地方。这个时候,要按一下回车键,系统就会提示你输入姓名和密码了。 101 | 102 | 输入后,进入系统,如图: 103 | 104 | 105 | 106 | 107 | ## 8、设置root密码 108 | 109 | 此时,我们可以通过自己命名的账号登录,但这个账号并不是 root 账号。 110 | 111 | 假如我们想登录 root 账号,就得知道他的密码是什么。 112 | 113 | 显然我们不知道。 114 | 115 | 但值得庆幸的是,第一个user是在admin组,所以他可以给root设置密码。 116 | 117 | 输入以下命令: 118 | 119 | ``` 120 | sudo passwd root 121 | 122 | [sudo] password for you :// 此时提示输入你当前账号的密码 123 | 124 | Enter new UNIX password: // 此时提示你输入 root 账号的密码,按enter确认 125 | // 然后再重复输入一次 126 | ``` 127 | 128 | 这时就搞定了。 129 | 130 | 131 | ## 9、设置虚拟机网络模式 132 | 133 | 有三种网络模式,桥接、NAT、Host-Only。 134 | 135 | 详解见:https://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html 136 | 137 | 我们这里使用桥接模式,像之前那样打开虚拟机的设置功能,如下图设置: 138 | 139 | 140 | 141 | 142 | ## 10、让Linux可以通过ftp来访问 143 | 144 | 参考文章:https://blog.csdn.net/timothy93bp/article/details/77527531 145 | 146 | #### 1、下载 vsftpd 147 | 148 | 输入命令: 149 | 150 | ``` 151 | sudo apt-get install vsftpd 152 | ``` 153 | 154 | 如果报错 ``could not get lock /var/lib/dpkg/lock`` ,参考这个链接;https://itsfoss.com/could-not-get-lock-error/ 155 | 156 | 具体来说,先输入 ``ps aux | grep -i apt`` 搜索哪些占用了 apt,然后通过 ``sudo kill -9 进程id`` 的方式干掉他。 157 | 158 | 安装的过程中,他会提示你会占用一些空间,升级一些东西和安装一些东西。输入 ``Y`` 然后回车确认即可。 159 | 160 | 一会就安好了。 161 | 162 | #### 2、配置 ftp 的密码 163 | 164 | 输入 ``sudo passwd ftp`` ,然后重复输入2次密码即可(账号名为你的默认账号名)。 165 | 166 | #### 3、修改配置文件 167 | 168 | 输入 ``sudo vim /etc/vsftpd.conf`` 编辑配置文件。按下 ``i`` 进入编辑模式。 169 | 170 | 这个文件的详细配置说明参考:https://blog.csdn.net/mengtianwxs/article/details/72997092 171 | 172 | 1. 删除 ``write_enable=YES`` 之前的 ``#`` 井号(即注释符号,下同); 173 | 2. 按 esc 返回命令模式,再输入 ``:wq`` ,保存退出; 174 | 175 | 输入 ``sudo service vsftpd restart`` 重启 ftp 服务器。 176 | 177 | 最终文件应该是这样的(如果你的和我不一样,可能是我改了但是漏了没写): 178 | 179 | https://github.com/qq20004604/notes/blob/master/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%9D%A5%E8%BF%90%E8%A1%8Clinux/vsftpd.conf 180 | 181 | 182 | #### 4、安装 ssh 183 | 184 | 参考文章:https://blog.csdn.net/netwalk/article/details/12952051 185 | 186 | 首先,Ubuntu缺省没有安装SSH Server,使用以下命令安装: 187 | 188 | ``` 189 | sudo apt-get install openssh-server 190 | ``` 191 | 192 | 然后输入 ``ps -e|grep ssh`` 确认 ssh 是否启动,如果显示 ``sshd`` 则表明已经启动了。 193 | 194 | 没启动的话,输入:``sudo /etc/init.d/ssh start`` 启动;或者 ``sudo /etc/init.d/ssh restart`` 重新启动; 195 | 196 | #### 5、登录 197 | 198 | windows客户端可以下载 FileZilla Client 来进行FTP登录。 199 | 200 | 如下图: 201 | 202 | * 协议选 SFTP; 203 | * 主机输入虚拟机的 IP(查询 ip 通过输入 ``ifconfig`` 命令,找 ``inet`` 后面的那个ip地址); 204 | * 端口不填(默认是22); 205 | * 输入用户名和密码(用户名用root); 206 | * 其他用户名,可以访问,但上传下载很麻烦,原因是需要处理权限问题。如果需要控制权限则使用其他账号 207 | 208 | 点击【连接】即可。 209 | 210 | 211 | 212 | **常见问题:** 213 | 214 | 1. 登录被拒绝怎么办? 215 | 1. 查看是否没有安装 ssh; 216 | 2. ssh服务是否没启动; 217 | 3. ``/etc/vsftpd.conf`` 是否按我所说的进行更改配置; 218 | 4. 重启一下 ssh 服务(命令见上面); 219 | 5. 重启一下 ftp 服务器(命令见上面); 220 | 6. 重启虚拟机; 221 | 7. 重启主机; 222 | 8. ping 一下试试(在主机输入``ping 虚拟机的ip地址``),能否ping通(ping不同说明ip可能是错的); 223 | 9. 通过 ssh 登录一下试试(命令 ``ssh 用户名@ip地址``),登录不了可能是ssh服务没启动; 224 | 10. 总之,以上都正常的话,分别重启虚拟机和主机; 225 | 226 | 登录成功的话,应该如下图: 227 | 228 | 229 | 230 | -------------------------------------------------------------------------------- /如何使用虚拟机来运行linux/vsftpd.conf: -------------------------------------------------------------------------------- 1 | # Example config file /etc/vsftpd.conf 2 | # 3 | # The default compiled in settings are fairly paranoid. This sample file 4 | # loosens things up a bit, to make the ftp daemon more usable. 5 | # Please see vsftpd.conf.5 for all compiled in defaults. 6 | # 7 | # READ THIS: This example file is NOT an exhaustive list of vsftpd options. 8 | # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's 9 | # capabilities. 10 | # 11 | # 12 | # Run standalone? vsftpd can run either from an inetd or as a standalone 13 | # daemon started from an initscript. 14 | # listen=YES 15 | # 16 | # This directive enables listening on IPv6 sockets. By default, listening 17 | # on the IPv6 "any" address (::) will accept connections from both IPv6 18 | # and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6 19 | # sockets. If you want that (perhaps because you want to listen on specific 20 | # addresses) then you must run two copies of vsftpd with two configuration 21 | # files. 22 | listen_ipv6=YES 23 | # 24 | # Allow anonymous FTP? (Disabled by default). 25 | anonymous_enable=NO 26 | # 27 | # Uncomment this to allow local users to log in. 28 | local_enable=YES 29 | # 30 | # Uncomment this to enable any form of FTP write command. 31 | write_enable=YES 32 | # 33 | # Default umask for local users is 077. You may wish to change this to 022, 34 | # if your users expect that (022 is used by most other ftpd's) 35 | # local_umask=022 36 | 37 | 38 | # 39 | # Uncomment this to allow the anonymous FTP user to upload files. This only 40 | # has an effect if the above global write enable is activated. Also, you will 41 | # obviously need to create a directory writable by the FTP user. 42 | #anon_upload_enable=YES 43 | # 44 | # Uncomment this if you want the anonymous FTP user to be able to create 45 | # new directories. 46 | #anon_mkdir_write_enable=YES 47 | # 48 | # Activate directory messages - messages given to remote users when they 49 | # go into a certain directory. 50 | dirmessage_enable=YES 51 | # 52 | # If enabled, vsftpd will display directory listings with the time 53 | # in your local time zone. The default is to display GMT. The 54 | # times returned by the MDTM FTP command are also affected by this 55 | # option. 56 | use_localtime=YES 57 | # 58 | # Activate logging of uploads/downloads. 59 | xferlog_enable=YES 60 | # 61 | # Make sure PORT transfer connections originate from port 20 (ftp-data). 62 | connect_from_port_20=YES 63 | # 64 | # If you want, you can arrange for uploaded anonymous files to be owned by 65 | # a different user. Note! Using "root" for uploaded files is not 66 | # recommended! 67 | #chown_uploads=YES 68 | #chown_username=whoever 69 | # 70 | # You may override where the log file goes if you like. The default is shown 71 | # below. 72 | #xferlog_file=/var/log/vsftpd.log 73 | # 74 | # If you want, you can have your log file in standard ftpd xferlog format. 75 | # Note that the default log file location is /var/log/xferlog in this case. 76 | #xferlog_std_format=YES 77 | # 78 | # You may change the default value for timing out an idle session. 79 | #idle_session_timeout=600 80 | # 81 | # You may change the default value for timing out a data connection. 82 | #data_connection_timeout=120 83 | # 84 | # It is recommended that you define on your system a unique user which the 85 | # ftp server can use as a totally isolated and unprivileged user. 86 | #nopriv_user=ftpsecure 87 | # 88 | # Enable this and the server will recognise asynchronous ABOR requests. Not 89 | # recommended for security (the code is non-trivial). Not enabling it, 90 | # however, may confuse older FTP clients. 91 | #async_abor_enable=YES 92 | # 93 | # By default the server will pretend to allow ASCII mode but in fact ignore 94 | # the request. Turn on the below options to have the server actually do ASCII 95 | # mangling on files when in ASCII mode. 96 | # Beware that on some FTP servers, ASCII support allows a denial of service 97 | # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd 98 | # predicted this attack and has always been safe, reporting the size of the 99 | # raw file. 100 | # ASCII mangling is a horrible feature of the protocol. 101 | #ascii_upload_enable=YES 102 | #ascii_download_enable=YES 103 | # 104 | # You may fully customise the login banner string: 105 | #ftpd_banner=Welcome to blah FTP service. 106 | # 107 | # You may specify a file of disallowed anonymous e-mail addresses. Apparently 108 | # useful for combatting certain DoS attacks. 109 | #deny_email_enable=YES 110 | # (default follows) 111 | #banned_email_file=/etc/vsftpd.banned_emails 112 | # 113 | # You may restrict local users to their home directories. See the FAQ for 114 | # the possible risks in this before using chroot_local_user or 115 | # chroot_list_enable below. 116 | # chroot_local_user=YES 117 | # 118 | # You may specify an explicit list of local users to chroot() to their home 119 | # directory. If chroot_local_user is YES, then this list becomes a list of 120 | # users to NOT chroot(). 121 | # (Warning! chroot'ing can be very dangerous. If using chroot, make sure that 122 | # the user does not have write access to the top level directory within the 123 | # chroot) 124 | # chroot_local_user=YES 125 | # chroot_list_enable=YES 126 | # (default follows) 127 | # chroot_list_file=/etc/vsftpd.chroot_list 128 | # 129 | # You may activate the "-R" option to the builtin ls. This is disabled by 130 | # default to avoid remote users being able to cause excessive I/O on large 131 | # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume 132 | # the presence of the "-R" option, so there is a strong case for enabling it. 133 | #ls_recurse_enable=YES 134 | # 135 | # Customization 136 | # 137 | # Some of vsftpd's settings don't fit the filesystem layout by 138 | # default. 139 | # 140 | # This option should be the name of a directory which is empty. Also, the 141 | # directory should not be writable by the ftp user. This directory is used 142 | # as a secure chroot() jail at times vsftpd does not require filesystem 143 | # access. 144 | secure_chroot_dir=/var/run/vsftpd/empty 145 | # 146 | # This string is the name of the PAM service vsftpd will use. 147 | pam_service_name=vsftpd 148 | # 149 | # This option specifies the location of the RSA certificate to use for SSL 150 | # encrypted connections. 151 | rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem 152 | rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key 153 | ssl_enable=NO 154 | 155 | # 156 | # Uncomment this to indicate that vsftpd use a utf8 filesystem. 157 | #utf8_filesystem=YES 158 | 159 | # local_root=/usr/local/wd 160 | 161 | -------------------------------------------------------------------------------- /数据库.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据库.docx -------------------------------------------------------------------------------- /数据结构/STL.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/STL.docx -------------------------------------------------------------------------------- /数据结构/二进制文件的读写.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/二进制文件的读写.docx -------------------------------------------------------------------------------- /数据结构/排序.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/排序.docx -------------------------------------------------------------------------------- /数据结构/数据结构总述.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/数据结构总述.docx -------------------------------------------------------------------------------- /数据结构/查找算法.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/查找算法.docx -------------------------------------------------------------------------------- /数据结构/树.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/树.docx -------------------------------------------------------------------------------- /数据结构/第二章算法.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/第二章算法.docx -------------------------------------------------------------------------------- /数据结构/迭代器.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/数据结构/迭代器.docx -------------------------------------------------------------------------------- /笔记本候选.md: -------------------------------------------------------------------------------- 1 | 前注: 2 | 3 | 价格主要取自京东,买的时候个人觉得可以和品牌供货商谈。 4 | 5 | 对电脑配置不太熟悉的话,可以看每一款配置最后的优缺点评价和综合点评。 6 | 7 | --- 8 | 9 | 1、戴尔 G3 10 | 11 | 参考链接: 12 | 13 | https://item.jd.com/100006778346.html#crumb-wrap 14 | 15 | 参考价格: 16 | 17 | 京东:7999 18 | 19 | 配置: 20 | 21 | * 英特尔 9 代 i7 CPU(i7-9750H) 22 | * 16G 内存 23 | * 15.6 寸显示器(72%色域); 24 | * 1TB 硬盘(机械硬盘) 25 | 26 | 优点: 27 | 28 | * 性能强(9 代 i7 的 cpu); 29 | * 高性价比(这个价位,相对配置是顶尖的); 30 | * 大内存(16G 内存足够满足开发使用); 31 | * 屏幕好不伤眼睛(办公人员可以放心更多时间去使用电脑); 32 | * 显卡还可以,可以用于做深度学习、AI 计算等需要依赖于显卡的业务; 33 | 34 | 缺点: 35 | 36 | * 续航一般(2-3小时); 37 | * 比较重(2-2.5kg); 38 | * 笨重,不适合出差携带; 39 | * 多彩键盘; 40 | 41 | 综合点评: 42 | 43 | 适合对机器性能要求比较高,对移动性和便携性要求比较低的研发人员使用。 44 | 45 | 不适合需要一定便携性的出差人员能使用。 46 | 47 | --- 48 | 49 | 2、联想 ThinkPad X1 Carbon 2019 50 | 51 | 参考链接: 52 | 53 | https://item.jd.com/100006650700.html#crumb-wrap 54 | 55 | 参考价格: 56 | 57 | 京东:9999 58 | 59 | 配置: 60 | 61 | * 英特尔 i5 CPU(i5-8265U) 62 | * 8G 内存; 63 | * 14 寸显示器; 64 | * 512G SSD(高性能硬盘); 65 | * 支持 4G 移动上网 66 | 67 | 优点: 68 | 69 | * 便携性高,适合出差使用(重量 < 1.5kg,屏幕只有 14 寸但分辨率依然是 1080P,续航可以达到 8 个小时); 70 | * 国企传统采购品牌,售后一般比较 ok; 71 | * 内置支持手机 4G 上网(需付费订购相关服务); 72 | 73 | 缺点: 74 | 75 | * 配置差,性价比低(比1#贵 2000,但除了硬盘,配置都不如上面的); 76 | * 美帝良心想的口碑,不是网友瞎说的; 77 | 78 | 综合评价: 79 | 80 | 适合对机器性能要求不高,但需要经常出差的人士使用。 81 | 82 | 不适合对电脑性能要求高的研发人员使用。 83 | 84 | --- 85 | 86 | 3、小米 Pro 2019 87 | 88 | 参考链接: 89 | 90 | https://item.jd.com/100003536681.html#crumb-wrap 91 | 92 | 参考价格: 93 | 94 | 京东:7299 95 | 96 | 配置: 97 | 98 | * 英特尔 i7 CPU(i7-8550U) 99 | * 16G 内存; 100 | * 15.6 寸显示器; 101 | * 512g SSD硬盘(高性能硬盘); 102 | 103 | 优点: 104 | 105 | * 小米,国产品牌,售后我觉得还算 ok; 106 | * 价格相对便宜; 107 | * 性价比中等; 108 | * 16G 内存足以满足一般开发需求; 109 | * cpu 的性能中等(但也比上面 thinkpad 好); 110 | * 高性能硬盘; 111 | * 续航强(5-8 小时); 112 | * 不适合玩游戏(办公专用的话,我觉得这条没毛病) 113 | 114 | 缺点: 115 | 116 | * cpu 性能不是特别好(大概是 1# 的 60~70%左右); 117 | * 重量中等(1.9kg); 118 | * 据说发热略高,风扇声音略大; 119 | 120 | 综合评价: 121 | 122 | 综合来看,性价比比较高,综合性能不突出,但也没有明显的缺陷。 123 | 124 | 同时适合对性能有一定要求的研发,和对便携性有要求的其他人员。 125 | 126 | 假如只考虑选购一款笔记本,但所有人都需要用的话,推荐用这款。否则推荐使用针对性更明确的不同款的组合。 127 | 128 | --- 129 | 130 | 4、Macbook Pro 17 款 13 寸 131 | 132 | 参考链接: 133 | 134 | https://item.jd.com/5225342.html 135 | 136 | 参考价格: 137 | 138 | 京东:9999 139 | 140 | 优点: 141 | 142 | * 续航超长,一般在 8~10 个小时; 143 | * 办公专用(国内外各大公司更爱使用 Mac 而不是 windows); 144 | * 实际性能超出同配置下的 windows 笔记本; 145 | * 有很多苹果系统专用的软件,可以提高生产力(做的 PPT 也更好看); 146 | * 便携性强(1.37kg,13 寸屏幕,高续航); 147 | * 内置 linux 命令行; 148 | * 适合前端、设计、产品经理、后端; 149 | 150 | 缺点: 151 | 152 | * 有一定上手难度,对没用过的人有学习成本; 153 | * 有一些 windows 的软件,在 mac 下没有同样的(需要找类似的软件); 154 | * 偏贵; 155 | 156 | 综合评价: 157 | 158 | 适合对电脑有一定了解,需要使用 linux 命令行的人。 159 | 160 | 适合从事软件研发业的任何人使用,并且大部分时候来说是最佳电脑。 161 | 162 | 但上手有一定门槛,也缺少一些 windows 下专用的软件。 -------------------------------------------------------------------------------- /网易云课堂/网易云课堂(DOM编程艺术).docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/网易云课堂/网易云课堂(DOM编程艺术).docx -------------------------------------------------------------------------------- /网易云课堂/网易云课堂(HTML和CSS).docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/网易云课堂/网易云课堂(HTML和CSS).docx -------------------------------------------------------------------------------- /网易云课堂/网易云课堂(JavaScript).docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/网易云课堂/网易云课堂(JavaScript).docx -------------------------------------------------------------------------------- /网易云课堂/网易云课堂(页面架构).docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qq20004604/notes/62ed9733d2cbb09cf2724b6b71fbec046cbbc2a2/网易云课堂/网易云课堂(页面架构).docx -------------------------------------------------------------------------------- /西安互联网开发招聘汇总(2019.5.24).md: -------------------------------------------------------------------------------- 1 | # 西安互联网开发招聘汇总 2 | 3 | ## 记得给star! 4 | 5 | 1、 农行软开: 6 | 7 | 类型:校招、社招 8 | 9 | 链接:https://job.abchina.com/rio/index.do?action=openHome 10 | 11 | 备注:校招要求硕士,英语6级,应届。社招主要是oracle和运维招聘 12 | 13 | --- 14 | 15 | 2、工行软开: 16 | 17 | 类型:校招、社招 18 | 19 | 链接:(社招) 20 | 21 | https://www.hotjob.cn/wt/ICBC/web/templet1000/index/corpwebPosition1000ICBC!getPostListByCondition?positionType=&brandCode=1&useForm=0&recruitType=2&showComp=true&pc.rowSize=7 22 | 23 | 备注:据说回复极慢或者不回复,需要在微信公众号上报名 24 | 25 | --- 26 | 27 | 3、浦发软开: 28 | 29 | 类型:社招 30 | 31 | 链接:https://news.spdb.com.cn/about_spd/recruitment/shzp/ 32 | 33 | 备注:需要邮件发送给对方邮箱,据说回复也很慢 34 | 35 | --- 36 | 37 | 4、浙商银行软开 38 | 39 | 类型:社招 40 | 41 | 链接:https://zp.czbank.com.cn/zpweb/planController/gotoIndex.mvc?pageType=2 42 | 43 | 备注:目测不是纯开发岗,而是偏管理 44 | 45 | --- 46 | 47 | 5、中国联通西安研究院 48 | 49 | 类型:社招、校招 50 | 51 | 链接:http://zglt2019.zhaopin.com/job.html 52 | 53 | 备注: 54 | 1. 找到一个能内推的人,但不确定:https://www.v2ex.com/t/530214 55 | 2. 社招可以输入框输入【西安】然后点击搜索。 56 | 57 | --- 58 | 59 | 6、中国移动雄安研究院 60 | 61 | 类型:社招、校招 62 | 63 | 链接: 64 | 65 | http://hotjob.cn/wt/CMRI/web/index/webPosition210!getPostListByConditionShowPic?columnId=2&operational=59aea13bed21327e66d9d2f4cd21fa0a269760918a545757b657180ec974fd987b29225b861a6079fc744488b1d0af58ac033f6023c898bcc73ce086ab048794e22ea8ae2d0fd4de836f8303b05ff21043f3ded18ed3f35c7f7bf54cde740e092a6b5381a4dd5b11 66 | 67 | 备注:最近招人蛮多的 68 | 69 | --- 70 | 71 | 7、京东 72 | 73 | 类型:社招 74 | 75 | 链接:https://jobs.51job.com/yx/co3275932.html 76 | 77 | 备注:我不想去京东跟东哥当兄弟,略略略 78 | 79 | --- 80 | 81 | 8、奥比中光 82 | 83 | 类型:社招 84 | 85 | 链接:https://jobs.51job.com/xian-gxjs/co3030205.html 86 | 87 | 备注: 88 | 1. 奥比中光成立于2013年1月,是我国人工智能3D传感领域独角兽。公司总部位于深圳,在美国西雅图、上海、广州、西安设有分部。奥比中光是继苹果、微软、英特尔之后,全球第四家,也是全亚洲第一家能量产消费级3D传感器的厂商。目前,奥比中光已推出多款3D传感摄像头,产品已应用于智能手机、智能机器人、智慧客厅、新零售、VR/AR、工业测量等多领域。2018年5月,奥比中光完成由蚂蚁金服领投的超两亿美金D轮融资,估值已超10亿美元。 89 | 2. 听说氛围可能不好,还996(https://www.zhihu.com/question/65974065) 90 | 91 | --- 92 | 93 | 9、中行软开 94 | 95 | 类型:校/社招、实习生招聘 96 | 97 | 链接:http://campus.chinahr.com/views/boc-spring2019/jobs.html 98 | 99 | 备注:似乎招聘已经结束了,我发邮件咨询中,尚未收到回复。 100 | 101 | --- 102 | 103 | 10、海康威视 104 | 105 | 类型:社招 106 | 107 | 链接:https://jobs.51job.com/xian/co2546282.html 108 | 109 | 备注:钱感觉也不多 110 | 111 | --- 112 | 113 | 11、大华 114 | 115 | 类型:社招 116 | 117 | 链接:https://jobs.51job.com/xian/co180850.html 118 | 119 | 备注:下限通常1w,上限不超过2w 120 | 121 | --- 122 | 123 | 12、国电南瑞西安研发 124 | 125 | 类型:社招 126 | 127 | 链接:没找到 128 | 129 | 备注:据说【没有编制,都是劳务派遣,待遇也一般】 130 | https://www.zhihu.com/question/286615325/answer/464746737 131 | 132 | --- 133 | 134 | 13、CVTE 135 | 136 | 类型:社招、校招 137 | 138 | 链接:http://hr.cvte.com/v2/positions?place=0&type=0&time=0&keyword=&page=0 139 | 140 | 备注:似乎没有常规的前后端开发岗位,西安甚至没几个岗位。 141 | 142 | --- 143 | 144 | 14、海尔优家智能科技 145 | 146 | 类型:社招、实习生 147 | 148 | 链接: 149 | https://www.zhipin.com/gongsir/5532224e28b7ea7d1nZz39i7Fw~~.html?city=101110100&ka=sel_city_101110100 150 | 151 | 备注: 152 | 前端岗位(12-18K) 153 | 154 | ``https://www.zhipin.com/job_detail/e7419337b61404d81XN409y9GVo~.html?ka=comp_joblist_3`` 155 | 156 | --- 157 | 158 | 15、浪潮 159 | 160 | 类型:社招 161 | 162 | 链接:https://vip.liepin.com/7893220/joblist.shtml 163 | 164 | 备注:目测只有Java 165 | 166 | --- 167 | 168 | 16、新华三 169 | 170 | 类型:社招 171 | 172 | 链接:https://jobs.51job.com/xian/co299000.html 173 | 174 | 备注:工资1w-2w 175 | 176 | --- 177 | 178 | 17、360企业安全 179 | 180 | 类型:社招 181 | 182 | 链接: 183 | https://www.zhipin.com/gongsir/92dd1835f489ca0e1XN-39i-.html?city=101110100&ka=sel_city_101110100 184 | 185 | 备注:只有产品经理岗 186 | 187 | --- 188 | 189 | 18、大疆 190 | 191 | 类型:社招,校招 192 | 193 | 链接:(社招)https://we.dji.com/zh-CN/social?city=6101 194 | 195 | 备注:没有常规的前后端开发岗,反而是偏硬件 196 | --------------------------------------------------------------------------------