分类: 推荐文章

深入理解并发和并行

深入理解并发和并行

并发是逻辑上的同时发生,而并行是物理上的同时发生。并发可以跑在一个处理器上通过时间片进行切换,而并行需要两个或两个以上的线程跑在不同的处理器上。如果同一个任务的多个线程始终运行在不变的CPU核心上,那就不是并行。

代码可读性之道

代码可读性之道

代码也是团队的沟通方式之一。试想,其他同事接手你负责的功能,如果代码结构清晰、注释合理,他就不会频繁打断你的工作、询问代码中的疑点。编写代码的时候,首先要考虑到别人的阅读感受,而不是你自己。在实际的开发工作中,最花费时间的事情是理解当前代码以及上下游代码逻辑。如果需要变更代码,代码可读性越差,花的时间越长,这个模块的可维护性就越低。

代码质量差,是程序员的错吗?

代码质量差,是程序员的错吗?

所有的技术团队都宣称自己重视代码质量,要求新人学习代码规范,也搞代码审查,实际上代码依然乱成一锅粥。我在职场经历过大大小小十多个技术团队,只有一个小团队的代码质量勉强合格,也只是遵循了基本的代码规范而已,代码可读性依然有很大提升空间。但是,几个核心的程序员离职后,新加入的同事迅速堆砌了大量低质量代码。这些代码差在哪儿呢?

计算的本质

计算的本质

图灵将世界上的数学问题分成了两类,一类是可以用图灵机在有限步内完成计算的,另一类是不可以的。今天我们说一个软件问题能不能计算,其实不是指数学计算,而是能否用图灵机这个简单逻辑来计算。图灵机给后人设计计算机制定了一个行之有效的原则,就是计算机可以通过存储地址、计算机状态、规则表和当前位置的读写来进行计算。

系统架构7个非功能性需求

系统架构7个非功能性需求

非功能性需求是什么呢?保障系统持续健康运转的辅助需求。依然以电商系统的优惠券为例,在促销活动期间发放大量优惠券,如何防止用户集中领券时系统不崩盘呢?活动结束后,如何收缩服务器,节省服务器资源呢? 非功能性需求是面向运维的,重要但是不太紧迫,有时候可以没有操作界面,由架构师提出解决方案,再推动各个业务开发部门去接入相应组件。这些辅助系统对业务系统性能影响很小,并且长期处于优化状态。

爱盈球项目详细设计

爱盈球项目详细设计

爱盈球是一个体育赛事推荐平台,汇聚知名足球和篮球赛事专家,为用户提供优质赛事解读和赛果预测。专家结合球队资讯和全球市场的赔率,发布包含赛果预测和最佳购彩方式的赛事解读,用户付费订阅解读,平台和专家各自获得相应的分成。爱盈球项目主要由用户订单系统、专家解读系统、平台运营管理系统组成,辅助系统有赛事管理系统、用户社交系统等等。

再一次,实现听歌自由

再一次,实现听歌自由

20年前,中国网民听歌是自由的,准确点说是听盗版歌的自由。2002年11月,百度上线MP3搜索功能,几乎能搜索和下载到所有的歌曲。按相关的版权法规,百度未经授权使用他人资源牟利是违法的。当时互联网产业违法采集数据、传播盗版是家常便饭,版权管理形同虚设,百度顺势而为分了一块大蛋糕。盗版音乐砸了音乐人的饭碗,就如同盗版软件摧残软件从业者。最近十多年,政府对音像作品版权的管理日趋严格,这是一件利国利民的好事,一个行业兴盛的起点首先是从业者得到应有的报酬。

老者Java,奋战一线

老者Java,奋战一线

Java已经诞生20多年了,依然是企业级开发中使用最广泛的语言,也是挨骂最多的语言。Java广受批评的四个缺点是:性能差、内存消耗大、GUI弱、代码啰嗦,我们应该如何看待这几个问题呢?在微服务的背景下,提倡围绕业务能力而非技术来构建应用,允许由不同的语言构建应用程序。一个超大的集群,往往有上万个微服务的容器在运行。为了更有效率的管理容器,必须对微服务提几点要求:镜像体积小、内存消耗小、启动速度快,这些却都是Java的弱项。

彻底理解协程

彻底理解协程

协程不是操作系统的底层特性,系统感知不到它的存在。它运行在线程里面,通过分时复用线程的方式运行,不会增加线程的数量。协程也有上下文切换,但是不会切换到内核态去,比线程切换的开销要小很多。每个协程的体积比线程要小得多,一个线程可以容纳数量相当可观的协程。在IO密集型的任务中有着大量的阻塞等待过程,协程采用协作式调度,在IO阻塞的时候让出CPU,当IO就绪后再主动占用CPU,牺牲任务执行的公平性换取吞吐量。

彻底理解线程

彻底理解线程

操作系统支持多个应用程序同时执行,每个应用至少对应一个进程,彼此之间的操作和数据不受干扰。当一个进程需要磁盘IO的时候,CPU就切换到另外的进程去执行,提高了CPU利用率。CPU在不同的进程之间切换执行,任务多的时候一直处于工作状态。有了进程,为什么还要线程?因为进程的成本太高了。启动新的进程必须分配独立的内存空间,建立数据表维护它的代码段、堆栈段和数据段,这是昂贵的多任务工作方式。如果两个进程之间需要通信,要采用管道通信、消息队列、共享内存等等方式。线程可以看作轻量化的进程,或者粒度更小的进程。线程之间使用相同的地址空间,切换线程的时间远远小于切换进程的时间。一个进程的开销大约是线程开销的30倍左右。