最新 | 最热门 | 最高评价

+0  推荐训练平台 LeetCode(力扣)

Tag: 程序设计
Felix021 发于 2019年01月29日 16:58 | 点击: 699 | 展开摘要
TLDR版本:https://leetcode-cn.com/explore/ ,注册一个帐号开始做题就行了。

== 以下是正文 ==

作为一个程序员,编码能力是基础的基础。

我比较幸运,在大学的时候参加了学校的 ACM/ICPC 集训队,接触了 ACM/ICPC 比赛。这是一个针对大学生编程能力的世界级比赛,要求在几个小时的时间里完成若干道不同难度的题目,其中很多题目不仅需要复杂的算法、有各种特殊情况需要考虑,而且还有变态级的效率要求。强如楼教主(楼天城),也仅在 2

查看全文: http://www.udpwork.com/item/17369.html

+0  跳表 - 简明教程 in Python

Tag: 程序设计
Felix021 发于 2018年09月19日 05:30 | 点击: 770 | 展开摘要
# 1. 什么是跳表

跳表(Skip List)是基于链表 + 随机化实现的一个有序数据结构,可以达到平均 O(logN) 的查找、插入、删除效率,在实际运行中的效率往往超过 AVL 等平衡二叉树,而且其实现相对更简单、内存消耗更低。

Redis 的 ZSET 底层实现就是用的 Skip List,这里是 [Antirez对此的说明](https://news.ycombinator.com/item?id=1171423)。

这是一个典型的跳表:

[0

查看全文: http://www.udpwork.com/item/17092.html

+0  解析一个简单的分布式事务Case

Tag: 程序设计
Felix021 发于 2018年03月02日 22:41 | 点击: 751 | 展开摘要
我注意到过去几个月我司有些同学还在踩一个简单的分布式事务Case的坑,而这个坑在两年以前就已经有同学踩过了,这里简单解析一下这个case和合适的处理方案,供参考。

1. 踩过的坑

这个case有很多变种,先从我们在XX业务踩过的坑开始,大约是16年9月,核心业务需求是很简单的:在用户发起支付请求的时候,从用户的银行卡扣一笔钱。负责这个需求的同学是这么写的代码(去除其他业务逻辑的简化版):
$dbTrans = $db->beginTransaction();
try

查看全文: http://www.udpwork.com/item/16684.html

+0  API设计原则 – Qt官网的设计实践总结

Tag: C/C++语言 | 技术读物 | 程序设计 | 系统架构 | API | api-design | API设计 | C++ | Coding | Design | Programmer
李 鼎 发于 2017年07月25日 14:16 | 点击: 912 | 展开摘要
(感谢好友 @李鼎 翻译此文)

原文链接:API Design Principles – Qt Wiki

基于Gary的影响力上 Gary Gao 的译文稿:C++的API设计指导

译序

Qt的设计水准在业界很有口碑,一致、易于掌握和强大的API是Qt最著名的优点之一。此文既是Qt官网上的API设计指导准则,也是Qt在API设计上的实践总结。虽然Qt用的是C++,但其中设计原则和思考是具有普适性的(如果你对C++还不精通,可以忽略与C++强相关或是过于细节

查看全文: http://www.udpwork.com/item/16371.html

+0  Linux PID 1 和 Systemd

Tag: Unix/Linux | 操作系统 | 程序设计 | Linux | Systemd | Unix | Upstart
陈皓 发于 2017年07月16日 21:40 | 点击: 699 | 展开摘要
要说清 Systemd,得先从Linux操作系统的启动说起。Linux 操作系统的启动首先从 BIOS 开始,然后由 Boot Loader 载入内核,并初始化内核。内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程,也叫根进程。它负责产生其他所有用户进程。所有的进程都会被挂在这个进程下,如果这个进程退出了,那么所有的进程都被 kill 。如果一个子进程的父进程退了,那么这个子进程会被挂到 PID 1 下面。(注:PID 0

查看全文: http://www.udpwork.com/item/16372.html

+0  Go语言的修饰器编程

Tag: Go 语言 | 程序设计 | 编程语言 | functional | Go | golang | Programming | 函数式
陈皓 发于 2017年06月01日 16:48 | 点击: 1131 | 展开摘要
之前写过一篇《Python修饰器的函数式编程》,这种模式很容易的可以把一些函数装配到另外一些函数上,可以让你的代码更为的简单,也可以让一些“小功能型”的代码复用性更高,让代码中的函数可以像乐高玩具那样自由地拼装。所以,一直以来,我对修饰器decoration这种编程模式情有独钟,这里写一篇Go语言相关的文章。

看过Python修饰器那篇文章的同学,一定知道这是一种函数式编程的玩法——用一个高阶函数来包装一下。多唠叨一句,关于函数式编程,可以参看我之前写过一篇文章《函数式编程

查看全文: http://www.udpwork.com/item/16287.html

+0  如何重构“箭头型”代码

Tag: C/C++语言 | 程序设计 | 编程语言 | Code Review | Programming | Refactory
陈皓 发于 2017年04月05日 18:07 | 点击: 1446 | 展开摘要
本文主要起因是,一次在微博上和朋友关于嵌套好几层的if-else语句的代码重构的讨论(微博原文),在微博上大家有各式各样的问题和想法。按道理来说这些都是编程的基本功,似乎不太值得写一篇文章,不过我觉得很多东西可以从一个简单的东西出发,到达本质,所以,我觉得有必要在这里写一篇的文章。不一定全对,只希望得到更多的讨论,因为有了更深入的讨论才能进步。

文章有点长,我在文章最后会给出相关的思考和总结陈词,你可以跳到结尾。

所谓箭头型代码,基本上来说就是下面这个图片所示的情况。

查看全文: http://www.udpwork.com/item/16198.html

+0  AWS 的 S3 故障回顾和思考

Tag: 业界新闻 | 杂项资源 | 程序设计 | Amazon S3 | AWS | Design | High Availability
陈皓 发于 2017年03月03日 14:20 | 点击: 1297 | 展开摘要
继Gitlab的误删除数据事件没几天,“不沉航母” AWS S3 (Simple Storage Service)几天前也“沉”了4个小时,墙外的半个互联网也跟着挂了。如约,按 AWS 惯例,AWS今天给出了一个简单的故障报告《Summary of the Amazon S3 Service Disruption in the Northern Virginia (US-EAST-1) Region》。这个故障和简单来说和Gitlab一样,也是人员误操作。先简单的说一下这份报

查看全文: http://www.udpwork.com/item/16156.html

+0  从Gitlab误删除数据库想到的

Tag: 技术新闻 | 程序设计 | 系统架构 | Design | Gitlab | High Availability | Programmer | 分布式 | 程序员
陈皓 发于 2017年02月02日 16:11 | 点击: 1481 | 展开摘要
昨天,Gitlab.com发生了一个大事,某同学误删了数据库,这个事看似是个低级错误,不过,因为Gitlab把整个过程的细节都全部暴露出来了,所以,可以看到很多东西,而对于类似这样的事情,我自己以前也干过,而在最近的两公司中我也见过(Amazon中见过一次,阿里中见过至少四次),正好通过这个事来说说一下自己的一些感想和观点吧。我先放个观点:你觉得有备份系统就不会丢数据了吗?

事件回顾

整个事件的回顾Gitlab.com在第一时间就放到了Google Doc上,事后,又发了

查看全文: http://www.udpwork.com/item/16085.html

+0  如何读懂并写出装逼的函数式代码

Tag: 杂项资源 | 程序设计 | 编程语言 | Closure | functional | Javascript | Y combinator
陈皓 发于 2016年10月23日 17:56 | 点击: 1315 | 展开摘要
今天在微博上看到了 有人分享了下面的这段函数式代码,我把代码贴到下面,不过我对原来的代码略有改动,对于函数式的版本,咋一看,的确令人非常费解,仔细看一下,你可能就晕掉了,似乎完全就是天书,看上去非常装逼,哈哈。不过,我感觉解析那段函数式的代码可能会一个比较有趣过程,而且,我以前写过一篇《函数式编程》的入门式的文章,正好可以用这个例子,再升华一下原来的那篇文章,顺便可以向大家更好的介绍很多基础知识,所以写下这篇文章。

先看代码

这个代码平淡无奇,就是从一个数组中找到一个数,

查看全文: http://www.udpwork.com/item/15886.html

+0  关于高可用的系统

Tag: 技术管理 | 程序设计 | 系统架构 | Design | High Availability | Paxos | Programmer | 分布式 | 程序员
陈皓 发于 2016年08月21日 12:34 | 点击: 1343 | 展开摘要
在《这多年来我一直在钻研的技术》这篇文章中,我讲述了一下,我这么多年来一直在关注的技术领域,其中我多次提到了工业级的软件,我还以为有很多人会问我怎么定义工业级?以及一个高可用性的软件系统应该要怎么干出来?这样我也可以顺理成章的写下这篇文章,但是没有人问,那么,我只好厚颜无耻的自己写下这篇文章了。哈哈。

另外,我在一些讨论高可用系统的地方看到大家只讨论各个公司的技术方案,其实,高可用的系统并不简单的是技术方案,一个高可用的系统其实还包括很多别的东西,所以,我觉得大家对高可用的

查看全文: http://www.udpwork.com/item/15755.html

+0  缓存更新的套路

Tag: Unix/Linux | 程序设计 | cache | Design | design pattern | Linux
陈皓 发于 2016年07月27日 16:25 | 点击: 1195 | 展开摘要
看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。

我不知道为什么这么多人用的都是这个逻辑,当我在微博上发了这个贴以后,我发现好些人给了好多非常复杂和诡异的方案,所以,

查看全文: http://www.udpwork.com/item/15697.html
|<<<1234567>>>| 一共9页, 99条记录