ARTS 01 - 技术人的理想主义

用户头像
jerry.mei
关注
发布于: 2020 年 06 月 03 日
ARTS 01 - 技术人的理想主义

ARTS左耳朵耗子提出来的一个打卡任务。每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西!我希望这个事可以给大家得到相应的算法、代码、技术和影响力的训练。



这是我的第一周打卡,标题为“技术人的理想主义”,取自我要分享的文章《爱因互动 CTO 洪强宁:当别人用月薪去衡量程序员时,我们自己应该谈点理想》

Algorithm



两数之和

描述:



给定一个整数数组 nums 和一个目标值target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。



你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:



给定 nums = [2, 7, 11, 15], target = 9



因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

题解:



思路一:暴力循环法



暴力循环法的思路很简单,也比较符合大家的惯性思维。双层数组遍历,外层循环遍历nums数组,内层循环判断数组余下的值是否存在相加等于target的元素

function twoSum(nums, target) {
let i = 0, j;
for (; i < nums.length; i++) {
for (j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
return [i, j];
}
}
}
}

时间复杂度:O(n^2)



思路二:两遍散列表



对于这种问题,在算法中首先想到的是用散列表来实现,把O(n)的问题转换成O(1)的问题来实现。在这里,我们只是使用散列表的思想,在Javascript里面没有散列表这种数据类型,我们可以使用Map来实现。

function twoSum(nums, target) {
const map = new Map(nums.map((value, key) => [value, key]))
let i = 0, complement;
for (i; i < nums.length; i++) {
complement = target - nums[i];
if (map.has(complement) && map.get(complement) !== i) {
return [i, map.get(complement)]
}
}
}

时间复杂度:O(n)



思路三:一遍散列表



在思路二的基础上做的优化。我们没必要一开始就对整个nums数组做一遍散列函数转换。在迭代nums数组的时候,我们把元素插入到Map的同时,会首先检查Map中是否已存在满足条件的目标元素。如果存在,直接返回结果;不存在,就插入到Map里面

function twoSum(nums, target) {
const map = new Map()
let i = 0, complement
for (i; i < nums.length; i++) {
complement = target - nums[i]
if (map.has(complement)) {
return [map.get(complement), i]
}
map.set(nums[i], i)
}
}

时间复杂度:O(n)

Review



How to structure your Vue project for the long term



最近一直在找关于怎么用Vue来构建一个大型的企业级应用的资料。相关文章和视频翻阅了不少,对于这种问题,行业的实践还是比较少的。这篇文章中作者给出了自己的一些思路。



首先,对于一个需要长期开发的应用来说,它的体量是越来越大的。我们尤其要关注的是Scalability(可扩展性)Maintainability(可维护性)。其次,每个项目的业务场景和团队工作的方式都不尽相同,所以不存在一个最佳的项目架构。软件开发是没有银弹的。但是我们还是可以找出解决复杂项目的一些通用思想。比如作者提出的几点:



  1. Source code navigation(源代码可导航)

  2. Testability(易于测试)

  3. Monitoring + Observability(监控和观察)

  4. Debugging(调试)

  5. Collaboration(协作)



具体的实现措施,这篇文章大篇幅讲的都是使用基于模块而非文件的项目结构。vue-cli提供的项目结构对于小型的项目来说,可以达到开箱即用的效果。但是对于中大型的项目,这种组织方式并不太好。作者推荐的是根据业务模块划分成不同的module,每个module里包含对应的componentsservicesrouterstore等等。



然后就是要做到模块的隔离,这个可以参考SOLID原则来设计。在大型项目中,不同的组件之间经常需要进行交互,隔离模块的内部实现细节是非常重要的。



最后有一点大家比较容易忽视,就是技术文档的撰写。对于大型项目来说,一个好的README.md文件可以带来很多的方便。

Tip



最近从Ubuntu转到了Mac平台来做开发,自己折腾摸索了不少关于Mac上实用的技巧。



1. .zshrc配置



有些常用的命令可以配置在.zshrc终端环境中,比如

alias ll='ls -l -a '

可以实现ll命令

export https_proxy=http://localhost:1234

让代理直接在命令行生效



2. SCROLL REVERSER实现鼠标的滚轮表现形式跟触摸板不同



Mac外接鼠标后发现滚轮跟在Windows上的表现形式是相反的,很不习惯,发现这款软件可以自定义鼠标和触摸板的方向设置,很不错。



3. 外接双显示器



公司用的是双显示器,买了一个扩展坞发现同时接上HDMIVGA会被识别成一个显示器。后来发现要插两个不同的雷电接口才能被识别成两台显示器。解决方案是买两个扩展坞或再专门买一个Type-CHDMI/VGA的高清转换器。

Share



分享文章:爱因互动 CTO 洪强宁:当别人用月薪去衡量程序员时,我们自己应该谈点理想



每当在这条路上坚持不下去的时候,重新再看一下洪强宁的这篇文章,又坚定了信心,继续跟自己死磕。



InfoQ的二叉树上有一个关于他的采访视频,也很值得一看:

洪强宁:编程三十年,因 Python 结识豆瓣,想用技术改变世界



发布于: 2020 年 06 月 03 日 阅读数: 129
用户头像

jerry.mei

关注

Coding is ARTS 2019.01.03 加入

全栈工程师,目前研究领域为函数式编程、使用Vue构建大型项目、企业级项目架构

评论 (3 条评论)

发布
用户头像
有能力才能谈理想,没有能力还是谈薪资吧!等你面对柴米油盐的时候谈理想试试?
2020 年 06 月 03 日 11:00
回复
不需要面对柴米油盐,又不贵😄
2020 年 06 月 03 日 16:08
回复
说出这话的人应该没结婚吧?
2020 年 06 月 09 日 08:14
回复
没有更多了
ARTS 01 - 技术人的理想主义