LuMing's blog

  • Home

  • Tags

  • Archives

<翻译> Linux 用户应该换到 BSD 的 6 个理由

Posted on 2018-09-02 | Edited on 2019-04-18

Linux 用户应该换到 BSD 的 6 个理由

迄今我因 BSD 是 自由及开源软件Free and Open Source Software(FOSS) 已经写了数篇关于它的文章。但总有人会问:“为什么要纠结于 BSD?”。我认为最好的办法是写一篇关于这个话题的文章。

为什么用 BSD 取代 Linux?

为了准备这篇文章,我与几位 BSD 的用户聊了聊,其中有人使用了多年 Linux 而后转入 BSD。因而这篇文章的观点都来源于真实的 BSD 用户。本文希望提出一个不同的观点。

why use bsd over linux

1、BSD 不仅仅是一个内核

几个人都指出 BSD 提供的操作系统对于终端用户来说就是一个巨大而统一的软件包。他们指出所谓 “Linux” 仅仅说的是内核。一个 Linux 发行版由上述的内核与许多由发行者所选取的不同的应用与软件包组成。有时候安装新的软件包所导致的不兼容会使系统产生崩溃。

一个典型的 BSD 由内核和许多必要的软件包组成。这些包里的大多数是通过活跃的项目所开发,因此其具备高集成度与高响应度的特点。

2、软件包更值得信赖

说起软件包,BSD 用户提出的另一点是软件包的可信度。在 Linux 上,软件包可以从一堆不同的源上获得,一些是发行版的开发者提供的,另一些是第三方。Ubuntu 和其他发行版就遇到了在第三方应用里隐藏了恶意软件的问题。

在 BSD 上,所有的软件包由“集中式软件包/ ports 系统”所提供,“每个软件包都是单一仓库的一部分,并且每一步都设有安全系统”。这就确保了黑客不能将恶意软件潜入到看似稳定的应用程序中,保障了 BSD 的长期稳定性。

3、更新缓慢 = 更好的长期稳定性

如果更新是一场竞赛,那么 Linux 就是兔子,BSD 就是乌龟。甚至最慢的 Linux 发行版每年至少发布一个新版本(当然,除了 Debian)。在 BSD 的世界里,重大版本的发布需要更长时间。这就意味着可以更关注于将事情做完善之后再将它推送给用户。

这也意味着操作系统的变化会随着时间的推移而发生。Linux 世界经历了数次快速而重大的变化,我们至今仍感觉如此(咳咳, systemD,咳咳)。就像 Debian 那样,长时间的开发周期可以帮助 BSD 去测试新的想法,保证在它在永久改变之前正常工作。它也有助于生产出不太可能出现问题的代码。

4、Linux 太乱了

没有一个 BSD 用户直截了当地指出这一点,但这是他们许多经验所显示出的情况。很多用户从一个 Linux 发行版跳到另一个发行版去寻找适合他的版本。很多情况下,他们无法使所有的软件或硬件正常工作。这时,他们决定尝试使用 BSD,接着,所有的东西都正常工作了。

当考虑到如何选择 BSD 时,一切就变得相当简单。目前只有六个 BSD 发行版在积极开发。这些 BSD 中的每一个都有特定的用途。“OpenBSD 更安全,FreeBSD 适用于桌面或服务器,NetBSD 无所不包,DragonFlyBSD 精简高效”。与此同时,充斥着 Linux 世界的许多发行版仅仅是在现有的发行版上增加了主题或者图标而已。BSD 项目数量之少意味着它重复性低并且更加专注。

5、ZFS 支持

一个 BSD 用户说到他选择 BSD 最主要的原因是 ZFS。事实上,几乎所有我谈过的人都提到 BSD 支持 ZFS 是他们没有返回 Linux 的原因。

这一点是 Linux 从一开始就处于下风的地方。虽然在一些 Linux 发行版上可以使用 OpenZFS,但是 ZFS 已经内置在了 BSD 的内核中。这意味着 ZFS 在 BSD 上将会有更好地性能。尽管有过将 ZFS 加入到 Linux 内核中的数次尝试,但许可证问题依旧无法解决。

6、许可证

就许可证而言也有不同的看法。大多数人所持有的想法是,GPL 不是真正的自由,因为它限制了如何使用软件。一些人也认为 GPL “太庞大而复杂而难于理解,如果在开发过程中不仔细检查许可证会导致法律问题。”

另一方面,BSD 协议只有 3 条,并且允许任何人“使用软件、进行修改、做任何事,并且对开发者提供了保护”。

总结

这些仅仅只是一小部分人们使用 BSD 而不使用 Linux 的原因。如果你感兴趣,你可以在这阅读其他人的评论。如果你是 BSD 用户并且觉得我错过什么重要的地方,请在评论里说出你的想法。

如果你觉得这篇文章有意思,请在社交媒体上、技术资讯或者 Reddit 上分享它。


via: https://itsfoss.com/why-use-bsd/

作者:John Paul
选题:lujun9972
译者:LuuMing
校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

后记

虽然被组长夸翻译的好,但是看了 commit 之后才发现还是有不少语法错误。例如 :
1.在 Linux 上,软件包可以从一堆不同源上获得,一些是发行版的开发者
啥?软件包是开发者?
2.one big cohesive package——巨大而统一的软件包
cohesive 在这里实在不知道是什么意思,索性就翻译成内建包了,迷~
3.这就确保了黑客不能将恶意软件潜入看似稳定的应用程序中
潜入到。
4.尽管数次尝试将 ZFS 加入到 Linux 内核中,但协议问题依旧无法解决。 >> 尽管有过将 ZFS 加入到 Linux 内核中的数次尝试,但许可证问题依旧无法解决。
怎么说呢,尽量采用陈述句吧。
5.license - 协议 >> license - 许可证
我原本就是那么翻译的!只是看了百度百科 GPL 之后,索性就翻译为协议了。
P.S. 语文要学好。

linux-nvidia-driver-18-9-2

Posted on 2018-09-02 | Edited on 2019-04-18

在 linux-ubuntu-14.04 内核版本 linux-headers-4.4.0-134-generic 下安装英伟达驱动,一路坎坷。忙了一早上终于成功了,网上有诸多教程,要么不管用,要么过时了。自己写一下吧。

1. 下载最新驱动

一定要去nvidia 官方网站下载最新最新最新的驱动才行。本文截止时,最新版本为 390

2. 安装驱动

  1. 首先将下载好的文件放在英文目录下,因为待会需要到终端下执行安装。而终端下是无法正常显示中文的!!!。
  2. 注销当前用户,按 alt + ctrl + f1 进入终端。
    (坑点:进入终端后,输入用户名和密码后怎么都进不去,原因是终端下默认小键盘未开启)
  3. 进入安装文件目录,使用 sudo NVIDIA-Linux-x86_64-390.87.run 。接下来不出问题的话进入安装界面,继续后会报错,原因是第三方驱动 nouveau 冲突。
  4. sudo 修改 etc/modprobe.d/blacklist.conf,添加
    blacklist vga16fb
    blacklist nouveau
    blacklist rivafb
    blacklist nvidiafb
    blacklist rivatv
    
    禁止加载nouveau模块。
  5. 暂停桌面服务,sudo service lightdm stop

  6. 重新安装,成功。

  7. 重启之后,进入用户名密码登录界面,输入后enter,死循环。无法进入。

  8. alt+ctrl+f1 进入终端,发现提示 4.4.0-134-generic SMP mod_unload modversions should be 4.4.0-134-generic SMP mod_unload modversions retpoline。
  9. sudo 修改/usr/src/linux-headers-4.4.0-generic/include/linux/vermagic.h (做好备份)
    #ifdef PETPOLINE
    #define MODULE_VERMAGIC_RETPOLINE "retpoline"
    
    为
    #ifdef 1
    #define MODULE_VERMAGIC_RETPOLINE "retpoline"
    
    也就是强制替换。
  10. sudo reboot 重启,发现还是进不去桌面。

    以下纯属猜测

    实际上在第10步结束后已经大工告成了,但是由于没有执行内核更新命令导致修改后的vermagic.h没有生效。
    接下来我使用sudo apt-get purge nvidia*清除了所有用apt-get方式安装的英伟达驱动。在卸载过程中,我看到了update-initramfs更新等说明。重启之后成功进入桌面。
    所以,究竟是因为删除掉 nvidia 驱动成功的还是更新成功的已经不为人知了。
    总之,最后的状态是
    英伟达官方驱动安装成功。
    卸载了所有在apt-get 安装的驱动。
    /usr/src/linux-headers-4.4.0-generic/include/linux/vermagic.h 经过修改为第 10 步状态
    blacklist 恢复到原始状态
    

对齐

Posted on 2018-09-01 | Edited on 2019-04-18

1. 什么是对齐?

当你定义一个变量时,系统会给这个变量分配一段连续的空间。而由于CPU寻址的特殊性,32位 CPU 只能以 4 的整数倍来寻址。因此,如果一个变量被分配在两个不同的 4 字节块中,那么 CPU 就要读取两次,再将这个变量拼凑完成。为了 CPU 执行效率更高,需要进行字节对齐。

2. 对齐方式

对齐是为了 CPU 能够更高效率运行的,因此对齐的方式与CPU的类型密切相关。

2.1 64 位机器默认对齐

在64位操作系统上,如下数据结构占用的存储空间大小为多少字节:

struct A{
unsigned int a;
char b[2];
double c;
short d;
}

如果做一下简单的加法:4 + 2 + 8 + 2 = 16 显然是不对的。在 64 位机器上,复杂结构类型的对齐数为成员中占用空间最大的字节数,也就是 sizeof(double) = 8。因此 A 的结构为如下形式:

地址:| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
           {|------a---------|-----b----|不够c}{--------------------c---------------------------}{|----d------|----------------补充----------------------}
            |    第一次分配 8 个字节| 补充 |                    第二次分配8字节                                   第三次分配 8 字节

所谓 8 字节对齐便如上图所示。因此执行sizeof(A),将会得到 8 + 8 + 8 = 24。
亦或者是

struct test
{
        char a[3];
        int b;
        char c;
};

为 4 字节对齐,执行sizeof(test),得到3 + (1) + 4 + 1 + (3) = 12

2.2 32 位机器默认对齐

32位机器上字节对齐与 64 位相类似,唯一不同之处在于 32 位机器对齐数只能 小于等于4(默认为4)。因此

struct test
{
    int a;
    float b;
    char c;
}

sizeof(test) = 12。4 + 4 + 1 +(3)

struct test2
{
    short a;
    float c;
}

sizeof(test2) = 8。2 + (2) + 4

2.2 程序中指定对齐方式

什么是线程安全

Posted on 2018-09-01 | Edited on 2019-04-18

1. 什么是线程安全?

因为多线程编程的特点

2. 不安全因素

因为一个进程中具有多个线程,这些线程具有共享数据的特点。因而在并发过程中,会对全局变量或静态变量产生诸多不安全的操作。

3. 如何解决

<翻译> 如何在 Linux Shell 编程中定义和使用函数

Posted on 2018-09-01 | Edited on 2019-04-18

如何在 Linux Shell 编程中定义和使用函数

函数是一段可复用的代码。我们通常把重复的代码放进函数中并且在不同的地方去调用它。库是函数的集合。我们可以在库中定义经常使用的函数,这样其它脚本便可以不再重复代码而使用这些函数。

本文我们将讨论诸多关于函数的内容和一些使用技巧。为了方便演示,我将在 Ubuntu 系统上使用 Bourne Again SHell (Bash)。

调用函数

在 Shell 中调用函数和调用其它命令是一模一样的。例如,如果你的函数名称为 my_func,你可以在命令行中像下面这样执行它:

$ my_func

如果你的函数接收多个参数,那么可以像下面这样写(类似命令行参数的使用):

$ my_func arg1 arg2 arg3

定义函数

我们可以用下面的语法去定义一个函数:

function function_name {
    Body of function
}

函数的主体可以包含任何有效的命令、循环语句和其它函数或脚本。现在让我们创建一个简单的函数,它向屏幕上显示一些消息(注:直接在命令行里写)。

function print_msg {
    echo "Hello, World"
}

现在,让我们执行这个函数:

$ print_msg
Hello, World

不出所料,这个函数在屏幕上显示了一些消息。

在上面的例子中,我们直接在终端里创建了一个函数。这个函数也可以保存到文件中。如下面的例子所示。

#!/bin/bash
function print_msg {
    echo "Hello, World"
}
print_msg

我们已经在 function.sh 文件中定义了这个函数。现在让我们执行这个脚本:

$ chmod +x function.sh
$ ./function.sh
Hello, World

你可以看到,上面的输出和之前的是一模一样的。

更多函数用法

在上一小节中我们定义了一个非常简单的函数。然而在软件开发的过程中,我们需要更多高级的函数,它可以接收多个参数并且带有返回值。在这一小节中,我们将讨论这种函数。

向函数传递参数

我们可以像调用其它命令那样给函数提供参数。我们可以在函数里使用美元 $ 符号访问到这些参数。例如,$1 表示第一个参数,$2 代表第二个参数,以此类推。

让我们修改下之前的函数,让它以参数的形式接收信息。修改后的函数就像这样:

function print_msg {
    echo "Hello $1"
}

在上面的函数中我们使用 $1 符号访问第一个参数。让我们执行这个函数:

$ print_msg "LinuxTechi"

执行完后,生成如下信息:

Hello LinuxTechi

从函数中返回数值

跟其它编程语言一样,Bash 提供了返回语句让我们可以向调用者返回一些数值。让我们举例说明:

function func_return_value {
    return 10
}

上面的函数向调用者返回 10。让我们执行这个函数:

$ func_return_value
$ echo "Value returned by function is: $?"

当你执行完,将会产生如下的输出结果:

Value returned by function is: 10

提示:在 Bash 中使用 $? 去获取函数的返回值。

函数技巧

目前我们已经对 Bash 中的函数有了一些了解。现在让我们创建一些非常有用的 Bash 函数,它们可以让我们的生活变得更加轻松。

Logger

让我们创建一个 logger 函数,它可以输出带有日期和时间的 log 信息。

function log_msg {
    echo "[`date '+ %F %T'` ]: $@"
}

执行这个函数:

$ log_msg "This is sample log message"

执行完,就会生成如下信息:

[ 2018-08-16 19:56:34 ]: This is sample log message

显示系统信息

让我们创建一个显示 GNU/Linux 信息的函数

function system_info {
    echo "### OS information ###"
    lsb_release -a

    echo
    echo "### Processor information ###"
    processor=`grep -wc "processor" /proc/cpuinfo`
    model=`grep -w "model name" /proc/cpuinfo  | awk -F: '{print $2}'`
    echo "Processor = $processor"
    echo "Model     = $model"

    echo
    echo "### Memory information ###"
    total=`grep -w "MemTotal" /proc/meminfo | awk '{print $2}'`
    free=`grep -w "MemFree" /proc/meminfo | awk '{print $2}'`
    echo "Total memory: $total kB"
    echo "Free memory : $free kB"
}

执行完后会生成以下信息:

### OS information ###
No LSB modules are available.
Distributor ID:           Ubuntu
Description:   Ubuntu 18.04.1 LTS
Release:         18.04
Codename:    bionic

### Processor information ###
Processor = 1
Model     =  Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz

### Memory information ###
Total memory: 4015648 kB
Free memory : 2915428 kB

在当前目录下查找文件或者目录

下面的函数从当前目录下查找文件或者目录:

function search {
    find . -name $1
}

让我们使用下面的命令查找 dir4 这个目录:

$ search dir4

当你执行完命令后,将会产生如下输出:

./dir1/dir2/dir3/dir4

数字时钟

下面的函数在终端里创建了一个简单的数字时钟:

function digital_clock {
    clear
    while [ 1 ]
    do
        date +'%T'
        sleep 1
        clear
    done
}

函数库

库是函数的集合。将函数定义在文件里并在当前环境中导入那个文件,这样可以创建函数库。

假设我们已经在 utils.sh 中定义好了所有函数,接着在当前的环境下使用下面的命令导入函数:

$ source utils.sh

之后你就可以像调用其它 Bash 命令那样执行库中任何的函数了。

总结

本文我们讨论了诸多可以提升效率的实用技巧。我希望这篇文章能够启发你去创造自己的技巧。


via: https://www.linuxtechi.com/define-use-functions-linux-shell-script/

作者:Pradeep Kumar
选题:lujun9972
译者:LuuMing
校对:pityonline

本文由 LCTT 原创编译,Linux中国 荣誉推出

神一样的减枝操作

Posted on 2018-08-24 | Edited on 2019-04-18

今天在刷【PAT】1103 Integer Factorization(30 分),题目大意是这样的:

<翻译>开源网络工作:创新与机遇的温床

Posted on 2018-08-23 | Edited on 2019-04-18

======

随着全球经济更加靠近数字化未来,每个垂直行业的公司和组织都在紧抓如何进一步在业务与运营上整合与部署技术。虽然 IT 企业在很大程度上遥遥领先,但是他们的经验与教训已经应用在了各行各业。尽管全国失业率为 4.1%,但整个科技专业人员的整体的失业率在 4 月份为 1.9%,开源工作的未来看起来尤其光明。我在开源网络领域工作,并且目睹着创新和机遇正在改变世界交流的方式。

曾经是个发展缓慢的行业,现在由网络运营商、供应商、系统集成商和开发者所组成的网络生态系统正在采用开源软件,并且正在向商用硬件上运行的虚拟化和软件定义网络上转移。事实上,接近 70% 的全球移动用户由低频网络运营商成员所代表。该网络运营商成员致力于协调构成开放网络栈和相邻技术的项目。

技能需求

这一领域的开发者和系统管理员采用云原生和 DevOps 的方法开发新的使用案例,应对最紧迫的行业挑战。诸如容器、边缘计算等焦点领域大红大紫,并且在这一领域能够整合、协作、创新的开发者和系统管理员们的需求在日益增进。

开源软件与 Linux 使这一切成为可能,根据最近出版的 2018开源软件工作报告,高达 80% 的招聘经理寻找会 Linux 技能的应聘者,而 46% 希望在网络领域招聘人才,可以说“网络技术”在他们的招聘决策中起到了至关重要的作用。

开发人员相当抢手,72% 的招聘经理都在找他们,其次是 DevOps 开发者(59%),工程师(57%)和系统管理员(49%)。报告同时指出,对容器技能需求的惊人的增长符合了我们在网络领域所见到的,即创建云本地虚拟功能(CNFs)和在 XCI倡议 的 OPNFV 中持续集成/持续部署方法的增长。

开始吧

对于求职者来说,好消息是有着大量的关于开源软件的内容,包括免费的Linux 入门课程。好的工作需要有多项证书,因此我鼓励你探索更多领域,去寻求培训的机会。计算机网络方面,在OPNFV上查看最新的培训课程或者是ONAP项目,也可以选择这门开源网络技术简介课程。

如果你还没有做好这些,下载 2018开源软件工作报告 以获得更多见解,在广阔的开放源码技术世界中规划你的课程,去寻找另一边等待你的令人兴奋的职业!

点击这里下载完整的开源软件工作报告并且了解更多关于 Linux 的认证。


via: https://www.linux.com/blog/os-jobs-report/2018/7/open-source-networking-jobs-hotbed-innovation-and-opportunities

作者:Brandon Wick
选题:lujun9972
译者:LuuMing
校对:校对者ID

本文由 LCTT 原创编译,Linux中国 荣誉推出


后记

第一次翻译文章,水平很一般,用了好几次百度翻译和谷歌翻译。尤其是碰到长句子后就会发懵,其实用逗号隔开会容易理解很多。

Once a slower moving industry, the networking ecosystem of today -- made up of network operators, vendors, systems integrators, and developers -- is now embracing open source software and is shifting significantly towards virtualization and software defined networks running on commodity hardware.

Focus areas like containers and edge computing are red hot and the demand for developers and sysadmins who can integrate, collaborate, and innovate in this space is exploding.

还有一些:

native cloud---云本地
vendors---供应商
DevOps---专用名词,指过程、方法与系统的统称
sysadmins---系统管理员
tackle the most pressing industry challenges---应对最紧迫的行业挑战
most sought---抢手

<翻译> X-Y Problem

Posted on 2018-08-10 | Edited on 2019-04-18

什么是XY problem,抛开定义举个例子先:

1.举个例子

Q:有没有个函数能返回两个分隔符之间的字符串?
B:我不知道你说啥,但我觉得有。
C:split和splice呗。
D:Partition也行
Q:我试着用builtins得到字符串”attribute1: 50.223, attribute2: 442.1”中的数字。
D:为啥不直接解析字符串呢?
Q:我觉得(python) 有内建的解析函数。
D: 这样

pairs = [x.strip() for x in s.split(",")];
attribs = {k: v for x in pairs for k, v in [x.split(": ")]}

D:虽然有一些库,但我觉得这样已经足够简单了(如果你不关心错误处理的话)
D:如果可以的话用一些比较好的原始数据,比如json或yaml就简单多了。
Q:代码实际上来自于HTML
Q:我不知道怎样用HTML解析器或者别的来解析JavaScript
D:是不是仅仅嵌入在HTML里或者是拼版的HTML?
Q: 对,是嵌在HTML里的。
D: 如果是JavaScript,json就可以解析它。
Q: 谢谢
D:我没有说明白:json只是解析了数据结构,不是js代码
Q:我要解析的就是数据结构.
来源:what-is-the-xy-problem

2.定义

回过头来看X-Y problem

1)有人想解决问题X
2)他觉得Y可能是解决X问题的方法
3)但是他不知道Y应该怎么做
4)于是他去问别人Y应该怎么做?

来源:提问的智慧:X-Y PROBLEM

3.分析

也就是说,在上述例子中,

Q原本的目的是想解析HTML中嵌入的JavaScript中的数据 (X problem)

而他不知道如何解析JS,因此他自己想了个办法

有没有个函数能返回两个分隔符之间的字符串? (Y problem)

因此他花费了大量的时间来解决Y,岂不知单单改变数据格式json就可以解决问题。

暗杀教室--操作系统篇

Posted on 2018-08-05 | Edited on 2019-04-18

关于如何理解操作系统,其实完全可以用暗杀教室来举例。

新的学期开始了,敬业的杀老师为了完成最后的约定,满怀期待地推开了教室的大门。
令他吃惊的是,教室里只有小渚一人站在那里。
杀老师无奈地叹了口气,开始了新学期的第一堂课。

好的,上述便是一个操作系统模型,请你把整个教室想象成一个操作系统。
★杀老师—CPU
★学生—用户级线程
★上课的这个过程—进程

不一会,小枫同学也推开了教室的大门。
小枫是一个差生,学习的进度完全赶不上小渚。还好这对于移动速度可以达到20马赫的杀老师来说都不是事。
一个人只要来回地不停移动,就可以完成犹如分身术一样的操作。
这下就可以一对一教学了。

这便是多进程的图像,CPU通过时间片轮转的方式来回切换,实现了多个进程同时运行。

过了一会,小业同学也来了。
他可是个难缠的优等生,完全不把老师放在眼里。
他表示,“我只想一个人安静的看看书,有啥不懂的地方再来问老师 ”。老师也很无奈,但谁让人家学习好呢。
不过,事还每完,小业又说:”如果没有个座位的你让人怎么看书呢?亲爱的杀老师“。杀老师忍了,给他端了一个板凳过来。

★座位—内核级线程
★看书—IO请求
用户编写的程序是各式各样的,有一些便包含了对IO的请求(小业同学)。但是,一个用户线程不能达到直接对IO的控制,因为只有操作系统才能与硬件打交道,参与硬件的管理。因此,操作系统会向上层提供内核级线程(座位)的支持。当一个内核级线程服务于用户级线程时,便能够取得对外部设备的控制。

话说学霸小业果真是学霸,学起来完全不用老师的操心。
老师点点头,发出了会心的微笑。

★自习的过程—阻塞态
通常,IO请求(例如读写磁盘)用时非常地长。在此期间,完全可以释放对CPU的占用,将自己置为阻塞态。CPU只要定期过来检查其是否完成便可,期间无序等待。

看到小业那么狂,有些同学不服气也要自习。
为了减轻工作量,杀老师给教室里添加了一个铃铛,有人想要自习了,只要敲一下铃铛老师就会拿一个板凳过来。

★铃铛—系统调用
有些线程会不定期地进行IO操作,当想要进行IO操作时,线程会通过系统调用来使操作系统为其分配内核级线程,达到对硬件的访问。

另一边,小冈和小贝上的是同一堂课程,它们坐在一起,对老师讲课的内容津津乐道。

同一个进程中(一堂课)会有多个线程,进程中的线程能够互相进行通信。

读《人月神话》

Posted on 2018-08-04 | Edited on 2019-04-18

标题虽然叫做人月神话,但实际上跟神话传说没有半点关系,这是一本彻彻底底的管理学著作。
下面进行对原文的一些引用以及评论:

系统编程的进度安排背后的第一个错误的假设:“一切都将运作良好,每一项任务仅花费它所应该花费的时间”。

评:在所有的项目计划中,要在项目开始时做好最坏的假设。

软件任务进度安排:
1/3 计划
1/6 编码
1/4 构件测试和早期系统测试

评:正所谓“磨刀不误砍柴工”,在开始项目之前做好万全的设计,对整个项目建立起一张清晰的地图。在编码的过程中寻着地图的方向走,遇到障碍后拐几个弯也不会迷失方向。

Brooks法则:
Adding manpower to a late software project makes it later.
向进度落后的项目中增加人手,只会使进度更加落后。
项目的时间依赖于独立子任务的数量。需要协作沟通的人员数量影响着开发成本,因为成本的主要组成部分是互相的沟通和交流,以及更正沟通不当所引起的不良结果(系统调试)。
mills概念:“从个人艺术到公共实践”的编程观念转变。
外科手术似的队伍
1.外科医生。
2.副手。
3.管理员
4.编辑
5.两个文秘
6.程序职员
可选
7.工具维护人员
8.测试人员
9.语言专家

评:作者提出的一个对10人的编程团队进行专业化的角色分工的方案。要了解为什么这样做好,就得先知道怎样做不好。(待补充)
评:利益要分享,决策要独立。好的民主是互相对话。

1…3456

LuMing

57 posts
3 categories
11 tags
GitHub E-Mail
© 2020 LuMing
Powered by Hexo v3.9.0
|
Theme – NexT.Muse v6.3.0