- Algorithm。主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell。
- Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是http://Medium.com(需要梯子)以及各个公司的技术blog,如Netflix的。
- Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。
- Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章
打卡地址
最大子序和
给定一个整数数组
nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
这道题,我是纠结了好久才动手,动手之后感觉不是很难,只是写出来的东西非常啰嗦。
public static int maxSubArray(int[] nums) {
int maxSub = 0; // 结果.
Integer mininumNagativeNum = null; // 最小负数.
Integer maxinumPositiveNum = null; // 最大正数.
if (nums != null && nums.length > 0) {
for (int i = 0; i < nums.length; i++) {
// 获取元素.
int num = nums[i];
if (num <= 0) {
// 小于0.
if (mininumNagativeNum == null || num > mininumNagativeNum) {
// 设置最小负数.
mininumNagativeNum = num;
}
// 与maxSub比较,只判断maxSub大于0的情况.
if (maxSub > 0) {
int middleNum = maxSub + num;
if (middleNum > 0) {
maxSub = middleNum;
} else {
maxSub = 0;
}
}
} else {
// 大于0.
if (maxinumPositiveNum == null || num > maxinumPositiveNum) {
// 设置最大正数.
maxinumPositiveNum = num;
}
if (maxSub >= 0) {
maxSub = maxSub + num;
if (maxSub > maxinumPositiveNum) {
maxinumPositiveNum = maxSub;
}
} else {
// maxSub 小于0.
maxSub = num;
}
}
}
if (maxinumPositiveNum != null && maxinumPositiveNum > maxSub) {
maxSub = maxinumPositiveNum;
} else if (maxinumPositiveNum == null && mininumNagativeNum != null){
maxSub = mininumNagativeNum;
}
}
return maxSub;
}
public static int maxSubArray(int[] nums) {
int sum = nums[0];
int maxSum = nums[0];
if (nums != null && nums.length > 0) {
for (int i = 1; i < nums.length; i++) {
// 获取元素.
int num = nums[i];
if (sum > 0) {
sum += num;
} else {
sum = num;
}
maxSum = Math.max(maxSum, sum);
}
}
return maxSum;
}
Alumni Q&A with SwitchUp: Biology Bachelor’s to Software Development
一个生物音乐双学位,半个音乐学硕士转行前端工程师。这两个专业并不是他喜欢的,想要为之付出的,但是软件开发工作却让他如鱼得水,有动力也有激情工作和学习。
Determined not to be left behind:决定不在落后
academic:学术的;学业的
aptitude:资质;天资;天赋
propensity:倾向;习性
dedication:奉献精神;献身;
give internal tech talks:进行内部技术讨论
I specialize in front-end development in javascript but also hop on projects that utilize a variety of backends including Node or Rails.
我专门从事JavaScript的前端开发,但也会跳上使用各种后端(包括Node或Rails)的项目。
admittedly:不可否认
beneficial:有益的
navigate:航海;导航;确定位置和方向;
is beneficial to navigate the path to a career in software development.
对确定软件开发事业的方向是有益的
motivated:激励;激发;成为…的动机;是…的原因;推动…甘愿苦干;
pursuing:追求;致力于;执行;贯彻;
fundamentals:基本原理
mentorship:指导
paramount:至为重要的;首要的;
Focus on the fundamentals and be more selective about the opportunities that you will get. There are a lot of software jobs out there, and making sure you find yourself at a place where you can continue to learn quickly and have good mentorship is paramount.
专注于基础技术的学习,这样在机会来临时才能有更多的选择。现在有很多的软件开发工作,确保你找到一个可以继续快速有效的学习,并且能得到良好指导的地方是最重要的。
异步处理的设计要点
异步处理可能会因为一些故障导致我们的一些任务没有被处理,比如消息丢失,没有通知到,或通知到了,没有处理。有这一系列的问题,异步通知的方式需要任务处理方处理完成后,给任务发起方回传状态,这样确保不会有漏掉的。
另外,发起方也需要有个定时任务,把一些超时没有回传状态的任务再重新做一遍,你可以认为这是异步系统中的"对账”功能。当然,如果要重做的话,就需要处理方支持幂等性处理。
异步处理的整体业务事务问题,也就是说,异步处理在处理任务的时候,并不知道能否处理成功,于是就会一步一步地处理,如果到最后一步不能成功,那么你就需要回滚。这个时候,需要我们在弹力设计中说的补偿事务的流程。
并不是所有的业务都可以用异步的方式,比如一些需要强一致性的业务,使用异步的方式可能就不适合,这里需要我们小心地分析业务。我相信绝大多数的业务场景都用不到强一致性,包括银行业务。另外,在需要性能的时候,需要牺牲强一致性,变为最终一致性。
在运维时,我们要监控任务队列里的任务积压情况。如果有任务积压了,要能做到快速地扩容。如果不能扩容,而且任务积压太多,可能会导致整个系统挂掉,那么就要开始对前端流星进行限流。
最后,还想强调一下,异步处理系统的本质是把被动的任务处理变成主动的任务处理,其本质是在对任务进行调度和统筹管理。
上面的知识点就来自于与耗子叔的