Qida's Blog

纸上得来终觉浅,绝知此事要躬行。

brackets cheatsheet

Shell 扩展(Shell Expansions)

命令行的扩展是在拆分成词之后进行的。共有七种类型的扩展:

  • brace expansion
  • tilde expansion
  • parameter and variable expansion
  • command substitution
  • arithmetic expansion
  • word splitting
  • filename expansion

常用的四种如下

花括号扩展(Brace Expansion)

用于偷懒,例如:

1
x{a,b,cd}y

扩展为:

1
xay xby xcdy

再例如:

1
mkdir /usr/local/src/bash/{old,new,dist}

扩展为:

1
2
3
mkdir /usr/local/src/bash/old
mkdir /usr/local/src/bash/new
mkdir /usr/local/src/bash/dist

参数和变量扩展(Parameter and Variable Expansion)

1
${parameter}

算术扩展(Arithmetic Expansion)

1
$(( expression ))

命令替换(Command Substitution)

命令替换允许命令的输出替换命令本身。当命令被以下特殊字符包括时,将发生命令替换:

1
$(command)

1
`command`

参考

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Expansions

GUN/Bash 提供了一些内建命令 (BUILTIN COMMANDS),用于在命令行上方便使用:

常用类

echo 显示一行文本或变量

unset 取消变量

set 查看所有变量(环境变量&用户变量)

env 查看所有环境变量(格式好看些)

export

  • 查看所有环境变量
  • 将局部变量转成环境变量:
    • 可以利用 export 命令将局部变量转为环境变量,但是用户注销时值将丢失;
    • 环境配置文件中,经常会用到 export 命令,相当于每次登录时系统都帮用户 export 一下所需环境变量;
    • 环境变量在当前进程 fork 出来的子进程中也能被访问到;
    • 目前发现安装软件时有用。

source.

  • 加载环境配置文件(无须 exit 注销)
  • 执行脚本(在父进程bash中执行,设置的变量都会保留)

declaretypeset

  • -a 定义数组类型
  • -i 定义整数类型
  • -x 将用户变量转成环境变量(与 export 一样)
  • +x 将环境变量降为用户变量
  • -r 定义 readonly 类型

read 读取来自键盘输入的变量

  • -p 后接提示符
  • -t 后接等待“秒数”

test

  • -e 该文件名是否存在(exist)
  • -s 该文件大小是否非 0
  • -z 是否为空字符串(zero)
  • -f 是否为文件(file)
  • -d 是否为目录(directory)
  • -b 是否为块特殊文件(block)
  • -L 是否为连接文件(link)
  • -r -w -x 是否可读、可写、可执行
  • -a -o ! 且、或、非
  • -eq -ne -gt -lt -ge -le (判断2个整数)相等、不等、大于、小于、大于等于、小于等于

[]

  • 中括号 [] 的使用方法与 test 命令几乎一模一样,只是中括号常用于条件判断式 if…then…fi
  • 中括号内的每个元素,都要有空格符分隔
  • 中括号内的变量,最好都以双引号括起来
  • 中括号内的常量(字符串),最好都以单引号 '' 或双引号 "" 括起来

shsh 方式执行,至少需要 r 权限;若以绝对路径方式执行,则需要 rx 权限

  • -n 不执行 script,仅验证语法。若语法无误,则不显示任何信息。(貌似仅能验证关键字错误?)
  • -v 在执行 script 前,先将 script 的内容输出到屏幕上
  • -x 将 script 执行过程逐步输出到屏幕上

作业控制类

Bash 是一个多任务的 CLI ,有以下作业控制(Job Control)相关的命令:

命令 描述
jobs 显示(当前会话中的)后台作业表
fg 将后台作业调到前台执行(前台运行作业)
bg 继续执行指定的后台作业(后台运行作业)
Ctrl+Z 暂停/挂起目前的命令,转入后台运行。通过在命令后追加一个&,可以将该命令转入后台运行
Ctrl+C 终止目前的命令

more bash tricks

参考

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Builtin-Commands

builtins

Shell 命令

简单命令(Simple Commands)

即单个命令。

管道(Pipelines)

bash pipes

pipes

pipeline(管道)是一个或多个命令的序列,用字符 | 分隔。管道的命令格式如下:

1
command [ | command2 ... ]

管道的特点如下:

  • 管道是一个由“标准输入输出”链接起来的进程集合;
  • 管道中的每个命令都作为单独的进程来执行(即在一个子 shell 中启动);
  • 每一个进程的输出(stdout)被直接作为下一个进程的输入(stdin);
  • 管道命令不处理 standard error output(stderr);
  • 管道的符号为:|

管道的处理流程如下图:

pipe

重定向(Redirection)

描述符(Descriptor Number)

描述符 名称 描述
0 stdin 标准输入(Standard input)
1 stdout 标准输出(Standard output)
2 stderr 标准错误输出(Standard error)

file descriptors

操作符(Operator)

操作符 描述
< 重定向输入(Redirecting Input)
> 重定向输出(Redirecting Output),与 1> 等价
>> 追加到重定向输出(Appending Redirected Output)
2> 重定向错误输出(Redirecting Error)
2>> 追加到重定向错误输出(Appending Redirected Error)
&> 重定向标准输出和标准错误输出(Redirecting Standard Output and Standard Error)。 推荐使用,它与 >word 2>&1 在语义上等价
>& 同上,但不推荐使用
2>&1 将标准错误输出重定向到标准输出

redirects

在命令执行前,它的输入和输出可能被 redirected (重定向),该功能可以用于如下场景:

  • 屏幕输出的信息很重要,而且需要将它存下来时;
  • 一些运行命令的可能已知错误信息,想以 2> /dev/null 将它丢掉;
  • 一些系统的例行命令(例如写在 /etc/crontab)的运行结果,需要存下来时;
  • 错误信息与正确信息需要分别输出时。

例子:

快速创建带内容的文件:

1
$ echo "hello world" > /tmp/file

stdoutstderr 都重定向到本地日志文件:

1
java -jar app.jar >/tmp/stdout.log 2>&1

stdoutstderr 都丢弃(等价操作):

1
2
java -jar app.jar >/dev/null 2>&1
java -jar app.jar &>/dev/null

序列(Lists of Commands)

list(序列)是一个或多个管道,用操作符 ;&&&|| 分隔的序列, 并且可以选择用 ;&<newline> 新行符结束。

操作符 例子 描述
&& command1 && command2 一个 AND 序列。command2 只有在 command1 返回 0 时才被执行
|| command1 || command2 一个 OR 序列。command2 只有在 command1 返回非 0 状态时才被执行
; command1; command2 结束一个序列。不考虑命令的退出状态,连续执行命令
<newline> command<newline> 结束一个序列
& command1 & 如果一个命令是由 & 结束的, shell 将在后台的子 shell 中执行这个命令
  • AND 和 OR 序列的返回状态是序列中最后执行的命令的返回状态。
  • 这些序列操作符中, &&|| 优先级相同, ;& 优先级相同。

退出状态(Exit Status)

  • 从 shell 的角度看,一个命令退出状态是 0 意味着成功退出。 非零状态值表明失败。
  • 如果没有找到命令,为执行它而创建的子进程返回 127。
  • 如果找到了命令但是文件不可执行,返回状态是 126。
  • 如果命令由于扩展或重定向错误而失败,退出状态大于零。

使用场景

在某些情况下,很多命令我想要一次输入去运行,有两种方法:

  1. Shell Script
  2. 使用序列

例如,一串无人值守源代码形式安装的命令如下:

1
$ ./configure && make && make install

复合命令(Compound Commands)

compound command(复合命令)是如下情况之一:

1

  • (list)
  • { list; }
  • ((expression))
  • [[ expression ]]

if statements

  • if list; then list; [ elif list; then list; ] ... [ else list; ] fi

bash if statements

  • select name [ in word ] ; do list ; done
  • case word in [ [(] pattern [ | pattern ]

select in 通常和 case in 一起使用,在用户输入不同的编号时可以做出不同的反应,见:https://blog.csdn.net/yrx420909/article/details/104308041

for loops

  • while list; do list; done

  • until list; do list; done

  • for name [ in word ] ; do list ; done

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash

    # 声明一个数组变量
    order_array=(
    10000
    10001
    10002
    )

    # 循环打印与保存到文件
    for id in ${order_array[@]}
    do
    echo "order is $id" | tee -a result.txt
    done
  • for (( expr1 ; expr2 ; expr3 )) ; do list ; done

bash for loops

参考

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Arrays

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Commands

Shell 语法

引用(Quoting)

bash quotes

引用用于:

  • 阻止对特殊字符的处理。
  • 阻止保留字被识别。
  • 阻止参数的扩展。

三种引用机制:

引用符 描述
转义字符 \ 保留其后下一个字符的字面意义
单引号 '' 保留引用中所有字符的字面意义
双引号 "" 保留引用中所有字符的字面意义,例外的情况是 $, `, 和 \

单引号与双引号的使用区别:

quoting

注意,反引号 ` 与单引号 '' 和双引号 "" 作用不同,是用于命令替换(Command Substitution),详见《Shell 常用扩展总结》。

注释(Comments)

# 起始的词使得这个词和所有同一行上所有剩余的字符都被忽略。

Shell 参数(Shell Parameters)

参数(Parameter)是存储值的实体。它可以是以下三类:

  • 变量
  • 位置参数
  • 特殊参数

shell arguments

bash functions

变量(Varialbe)

变量,即用名称(name)表示的参数,其具有值(value)以及零或多个属性(attributes)

  • 通过 $name 引用,在双引号 "" 中可以被引用。

  • 通过以下语句为变量赋值:name=[value]。如果变量未赋值,默认值为 null 字符串。

  • 通过内建命令 unset 为取消变量。

  • 通过内建命令 declare 为变量分配属性(attributes)

所有值都接受以下扩展:

  • tilde expansion
  • parameter and variable expansion
  • command substitution
  • arithmetic expansion
  • quote removal

位置参数(Positional Parameters)

$n$1 表示第一个参数,$2 表示第二个参数,以此类推。

特殊参数(Special Parameters)

$0:表示脚本文件名

$#:表示命令行参数的个数

$?:前一个命令或函数的返回码,0 为成功,非 0 为错误/失败

$*:以”参数1 参数2 … “ 的形式保存所有参数

$@:以”参数1” “参数2” … 的形式保存所有参数

$$:本程序的 PID(进程 ID 号)

$!:最近执行的后台(即异步)命令的 PID

环境变量

environment variables

参考

https://www.gnu.org/software/bash/manual/html_node/Quoting.html

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameters

了解完什么是 Shell,有哪些 Shell 类型之后,本文开始主要关注 Bash Shell。

启动流程

  1. /bin/login 程序首先会检查 /etc/passwd 文件,在这个文件里包含了用户名、密码和该用户的登录 shell,如 /bin/bash 。 /bin/login 在子进程里用 execve 调用了 /bin/bash 。
  2. /bin/bash 读取 启动文件 并启动
  3. /bin/bash 处理用户键入的命令
  • 在执行磁盘上某个程序时,我们通常不会指定这个程序文件的绝对路径,比如要执行 echo 命令时,我们一般不会输入 /bin/echo ,而仅仅是输入 echo 。那为什么这样 bash 也能够找到 /bin/echo 呢?原因是 Linux 操作系统支持这样一种策略:shell 的一个环境变量 PATH 里头存放了程序的一些路径,当 shell 执行程序时会去这些目录下查找。
  • which 作为 shell(这里特指 bash )的一个内置命令,如果用户输入的命令是磁盘上的某个程序,它会返回这个文件的全路径。

启动文件

交互式 shell

Bash 如何执行它的启动文件?交互式 shell(interactive shell)下需要区分两种情况:

login shell

在下列情况下,我们可以获得一个 login shell:

  • 登录系统时获得的顶层 shell,无论是通过本地终端登录,还是通过网络 ssh 登录。这种情况下获得的 login shell 是一个交互式 shell。
  • 在终端下使用 --login 选项调用 bash,可以获得一个交互式 login shell。
  • 在脚本中使用 --login 选项调用 bash(比如在 shell 脚本第一行做如下指定:#!/bin/bash --login),此时得到一个非交互式的 login shell。
  • 使用 su - 切换到指定用户时,获得此用户的 login shell。如果不使用 -,则获得 non-login shell。

login shell 与 non-login shell 的主要区别在于它们启动时会读取不同的配置文件,从而导致环境不一样。login shell 启动时:

  • 首先读取全局配置:/etc/profile

  • 然后依次查找以下三个文件,读取第一个找到且可读的文件:

    • ~/.bash_profile
    • ~/.bash_login
    • ~/.profile
  • 退出时,读取:~/.bash_logout

no login shell

交互式的 non-login shell 启动时,会读取:

  • ~/.bashrc

通常我们要定制一些配置时(例如 alias 别名),会将配置写在 ~/.bashrc 中,然后在 ~/.bash_profile 中读取 ~/.bashrc,这样可以保证 login shell 和 non-login shell 得到相同的配置:

1
test -f ~/.bashrc && . ~/.bashrc

至于 /etc/profile 就不要轻易去改啦,毕竟会影响系统全局的配置。

非交互式 shell

  • 当 Bash 以非交互的方式(non-interactive shell)启动时,例如在运行一个 shell 脚本时,它会查找环境变量 BASH_ENV,如果存在则将它的值展开,使用展开的值作为一个文件的名称,读取并执行。 Bash 运作的过程就如同执行了下列命令:

    1
    2
    3
    if [ -n "$BASH_ENV" ]; then 
    . "$BASH_ENV";
    fi
  • 其它情况:

    Aliases are not expanded when the shell is not interactive.

    Functions are executed in the context of the current shell; no new process is created to interpret them (contrast this with the execution of a shell script).

参考

Bash Startup Files

Interactive Shells

使用$BASH_ENV来提权

什么是 Shell ?

参考维基百科:https://en.wikipedia.org/wiki/Shell_(computing)

In computing, a shell is a computer program which exposes an operating system‘s services to a human user or other programs. In general, operating system shells use either a command-line interface (CLI) or graphical user interface (GUI), depending on a computer’s role and particular operation. It is named a shell because it is the outermost layer around the operating system.

What's a shell

  • 一个命令行解释器,用于将用户输入的命令转换为系统操作;
  • Shell 既是交互式命令语言(CMD),也是脚本编程语言(Script);
  • Shell 有很多内置在其源代码中的命令。这些命令是内置的,所以 Shell 不必到磁盘上搜索它们,执行速度因此加快。不同的 Shell 内置命令有所不同;

有哪些 Shell ?

GUI (Graphical User Interface)

  • GNOME
  • KDE
  • ……

CLI (Command Line Interface)

  • Bourne Shell (sh)
  • Bourne Again Shell (Bash)
  • C Shell (csh)
    • 即 csh,1978年由 Bill Joy 在伯克利大学毕业后编写;
    • Bill Joy,Sun 联合创始人,vi 作者,BSD 作者;
    • csh 更加注重交互式使用而非脚本应用,引入了历史功能、别名、目录栈、作业控制等功能;
  • TENEX C Shell (tcsh)
  • Korn Shell (ksh)
  • Z Shell (Zsh)
  • ……

sh

https://en.wikipedia.org/wiki/Bourne_shell

  • 即 sh,是影响最广的 shell 。 1977 年由 Stephen Bourne 在贝尔实验室编写。虽无明文规定,但已成为事实上的标准;
  • 引入了 shell 通用的、基础的功能,例如管道、变量、条件判断、循环等;
  • 全部类 Unix 系统,都至少有一个与 sh 兼容的shell;
  • sh 一般位于 /bin/sh。目前大部分系统,/bin/sh 都是一个链接,指向一个兼容 sh 的、功能更丰富的 shell,如 bash;

Bash

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html

https://en.wikipedia.org/wiki/Bash_(Unix_shell)

Bash is a Unix shell and command language written by Brian Fox for the GNU Project as a free software replacement for the Bourne shell.

First released in 1989, it has been used as the default login shell for most Linux distributions.

  • 即 bash,1989年由 Brian Fox 为 GNU 项目编写。
  • 综合了 sh、csh、ksh 等各种 shell 的特性;
  • 名字有双关含义,既是字面上的意思,用于替换 sh,也隐含为了 GNU 而 born again 的意思;
  • 是 Mac OS X 和大部分 Linux 发行版的默认 shell;

Bash 脚本教程 - 阮一峰

Zsh

https://www.zsh.org/

https://ohmyz.sh/

https://en.wikipedia.org/wiki/Z_shell

The Z shell (Zsh) is a Unix shell that can be used as an interactive login shell and as a command interpreter for shell scripting.

Zsh is an extended Bourne shell with many improvements, including some features of Bash, ksh, and tcsh.

GUI 和 CLI 如何切换?

切换到 tty1 ~ tty6 终端:Ctrl + Alt + [F1 ~ F6]

切换到 GUI:Ctrl + Alt + [F7]

参考

https://en.wikipedia.org/wiki/Shell_(computing)

软件随想录》是一本有趣的技术书籍,阮一峰翻译的,值得一读。它总结了作者多年的从业经验,读完之后,感觉是从另一个更高的维度去提升了程序员的思维境界。

下面摘录整理了一些读书笔记:

人员管理

  1. 不懂编程的人管理软件公司,就好像不懂冲浪的人硬要去冲浪。
  2. 如同所有行业中最好的人才一样,那些优秀的程序员是不会出现在招聘市场上的。通常优秀的程序员在整个职业生涯中,可能会有 4 次求职。
  3. 找到优秀的程序员的 3 个基本方法:
    1. 走出去,不要只会上招聘网站
    2. 实习生
    3. 建立自己的社区(community)
  4. 员工推荐:小心陷阱。谨记仍然要要求应聘者通过剩下的所有面试,坚持高标准不变。
  5. Aeron 牌电脑椅,靠背和坐垫都被设计成网状形,空气可以自由流通,所以坐着不会捂汗。带有腰部支撑和后部平衡装置的顶级系列新型号,再加上尺寸如果正确,并且调节到最合适的位置,那么大多数人坐一整天都不会感到不舒服。
  6. 当一个程序员抱怨“人际关系复杂”时,他们的意思明白无误,就是指任何个人因素超过技术因素的环境
  7. 互联网公司的三种管理方法:
    1. 军事化管理法
      1. 在软件开发团队中,每个人干的活都不一样,所以如果想进行微观管理,就会变成抽风式 (hit-and-run) 的管理(大多数时候管理层对程序员不闻不问,偶尔却心血来潮介入,追问一些及其微小的细节,或坚持一定要百分之百按照他们的方式或需求做出来)。
    2. 经济利益驱动法
      1. 如果你使用经济利益驱动法,你就是在鼓励程序员与制度博弈。经济利益驱动法的问题是,它将内部激励变成了外部激励。认同法的作用恰恰相反,是为了设法创造出内部激励。
    3. 认同法
      1. 认同法要求你创造一个有凝聚力的、像胶水一样粘在一起的团队,就好像家庭一样。这样一来,人们就会对他们的同事产生忠诚感和义务感。

写给未来程序员的建议

  1. 对于某些最激动人心的编程任务来说,指针仍然是非常重要的。比如说,如果不用指针,你根本没办法开发Linux的内核。如果你不是真正地理解了指针,你连一行Linux的代码也看不懂,说实话,任何操作系统的代码你都看不懂。
  2. 如果你不懂函数式编程,你就无法创造出 MapReduce,正是这种算法使得 Google 的可扩展性达到如此巨大的规模。术语“Map”(映射)和“Reduce”(化简)分别来自Lisp语言和函数式编程。
  3. 消灭软件代码中的缺陷是一件边际报酬递减(随着软件中的缺陷越来越少,修复每一个缺陷所带来的收益也在变小)的事情。
  4. 有一种恐怖的东西叫做“内部软件”(inhouse software),做一个内部程序员( in-house programmer )糟透了:
    1. 你永远无法用正确的方法、而是被迫用最保险的方法做事。
    2. 内部软件只要“能用了”就会停止开发,因此你永远做不出优秀的产品。但如果你开发的是一个商用软件,你就可以不断对它加工、打磨、优化和改良。
    3. 如果你在专业的软件公司中编程,你的工作与公司的主营业务直接相关,是能够为公司直接带来收入的。这至少意味着一件事情,就是管理层会想到你。也就是说,你能得到最好的福利、最舒适的办公环境和最佳的晋升机会。
  5. 那些决定游戏规则的人都是善于写作的人。能不能清晰地写出技术内容的文章决定了你是一个口齿不清的程序员还是一个领袖。
  6. 读《微观经济学》,因为从经营一家公司的角度来看,比起那些不懂的程序员,一个理解基本商业规则的程序员将会更有价值,就是这么简单。

管理大型项目

  1. 网页设计师现在的处境,其实犹太人早在几十年前就体会到了,那就是所有人都同意遵守同一部法典并不能保证所有人的行为都符合同样的规范。因为法条太复杂、太深奥、太难懂了,想要完全正确地理解法条几乎是不可能的。
  2. 标准(如W3C)当然很重要的,但是你不能迷信标准,你必须理解由于人为犯错,所以标准有时候会引发误解、困惑、甚至是争议。
  3. 这是一个很好的例子,说明了“实用主义者”与“理想主义者”两大阵营之间存在的巨大鸿沟:用户升级新版IE后,无法“正常”浏览网站。他们不会为理想主义者那愚蠢的信仰叫好,不会理解为什么你们一定要网络浏览器符合某些神秘的、柏拉图式理想化的、实际上根本还没有实现的“标准”。他们不想听你们讲那些丑陋的Hack,他们只想要网络浏览器能够正常浏览现实中的网站。
  4. 理想主义者在大原则上是百分之百正确的。同样,实用主义者在现实中也是正确的。这场争论将精确地把世界分成两半,两大阵营之间的口水战将持续下去。
  5. 优秀的设计似乎是最容易复制的东西,但是做起来却又不是那么容易,因为做出优秀的设计本身就是一件“麻烦事”,实际上能够提供牢固得令人震惊的竞争优势。

编程建议

  1. 循证式日程规划(Evidence-Based Scheduling)
    1. 循证式日程规划先收集历史数据,主要来源是过去的time sheet,然后统计分析,得到了一条概率分布曲线,显示在任一个给定日期你完成工作的可能性有多大。
    2. 蒙特卡洛方法(Monte Carlo method)模拟未来各种可能的结果。
    3. 将每个任务所需的时间控制在16小时之内,这就会迫使你好好地去规划你要造成的那个任务。
    4. 几条经验:
      1. 只有第一线的程序员才能提出完成日期的估计值。任何管理层制定然后交给程序员去执行的日程规划,都注定会失败。只有真正负责开发的程序员才能估计出完成任务需要哪些步骤。
      2. 一发现错误就立即修正,将用时算入原始任务的用时之中。
      3. 防止管理层向程序员施加压力,被要求加快开发速度。如果程序员的进度落后于日程,就会感到惶惶不可终日,非常沮丧,这时再大的激励也是没用的。如果程序员的进度快于日程,则会感到欢欣鼓舞,工作效率非常高,这时根本不需要激励。日程规划并不是一个玩心理游戏的地方。
      4. 一份日程规划的好处之一,就是你会在工作开始之前,就被迫删去一些次要的或无用的功能,从而全力开发有用的或重要的功能。正是这种迫使你砍掉某些功能的压力,使得你最终做出一个更强大、更优秀的产品,它包括了很好的功能组合,而且能够在较早的日期完成。
    5. 有效的日程规划是创造优秀软件的钥匙。它强迫你首先完成最重要的功能,让你做出正确的选择,思考要开发一个怎样的软件。这会使你的产品变得更出色,使你的老板感到更开心,使你的客户感到更满意,以及更重要的一点,那就是使你下午6点能够准时下班。
  2. 战略问题
    1. 从长远的观点来看,那些不关心效率、不关心程序是否臃肿、一个劲往软件中加入高级功能的程序员最终将拥有更好的产品。
    2. 过去的积累可能会变成"历史包袱"。
  3. 编程
    1. 将“循环操作”这个单独的步骤抽象出来,用任何你想用的方法完成这个步骤,其中就包括用额外的硬件将运算过程轻松地扩展(Scale)到多台服务器上。谷歌的许多应用程序都使用了这种MapReduce技术,所以一旦有人对底层的并行计算程序进行优化或消除bug,那么所有这些应用程序都会受益。
    2. 寻找一种代码的书写规范,让错误的代码变得容易被看出。让代码中的相关信息在显示屏上集中在一起,使你能够当场发现和改正某些种类的错误。
    3. “应用型匈牙利命名法”(Apps Hungarian)是有价值的,它加强了代码之间的联结,使得代码更容易阅读、书写、除错和维护。最重要的是,它让错误的代码容易现形。

开办软件公司

  1. 三点意见
    1. 如果你说不清楚你的软件解决了什么棘手的问题,就不要去开软件公司。
    2. 不要独自一人创办公司。一个人创业十分孤独和压抑没有任何人与你交流思想,为你出谋划策。要是有两个人一起创业,你就会感到对你的合伙人负有义务,就会努力撑下去,渡过难关。
    3. 一开始不要抱有太高期望。
  2. 为什么低成本的软件供应商就不能在软件业中生存下来呢?我们只雇用最便宜的程序员为什么就是不行?根本原因是软件的销售复制成本为 0。这意味着,程序员的劳动力成本分摊在你销售出去的所有软件中,对软件来说,如果销售量很大,质量的改进成本并不会造成单位软件成本的上升。相反,软件质量的改进还会创造出新价值,而且价值创造的速度要快于成本提升的速度。
  3. 布鲁克斯法则(Brooks’ Law) ——向一个已经延误的软件项目增加人手,只会使它更加延误。一个优秀的程序员独自完成一项任务,就不需要额外的沟通和协调。如果同样的任务让 5 个程序员一起完成,他们之间就必须沟通和协调,这会花掉大量时间。开发团队越小,就越能获得额外的收益。人力与工时的互换只是一个神话。
  4. 用许多平庸的程序员取代少数优秀的程序员,这种做法的真正问题在于,不管平庸的程序员工作多长时间,他们做出来的东西都无法像优秀程序员做得那样好。
  5. 令人难过的是,内部软件很少重要到需要雇用巨星/优秀程序员来开发。这就是为什么最令人满意的职业生涯往往是在真正的软件公司里,而不是在银行担任 IT 技术人员。

经营软件公司

  1. 软件开发中,对你最重要、最关键的部分,一定要使用更原始的工具。至少也要使用开源/自由软件,这样至少出错的时候,你多多少少有机会解决问题,不会被解雇。
  2. 建立优质客服
    1. 技术支持团队必须能够与开发团队直接沟通,这很关键,这意味着你不能把技术支持人员外包出去,他们必须与开发人员在同一个地址办公,必须有途径让问题得到直接和彻底的解决。
    2. 当软件每次发生问题都被彻底解决之后,所有常见和容易的问题都被消灭了,技术支持工作实际上就变成了处理疑难杂症,对程序来说这意味着要进行调试和除错。因此对技术支持人员的要求更高、培训力度要更大。
    3. 很多时候,为了避免冒犯客户,我们要求客户去检查某样东西,都可以这样表达:不是直接要求他们去检查某个设置,而是告诉他们先改变这个设置,然后再改回去,目的是“确保这个设置被成功保存”。
    4. 客户投诉的时候,人很容易就变得感情用事。解决方法是记住一些重要句子,不断练习把它们说出口。等到你需要用到它们的场合,你就会把冲动自动抛在脑后,转而让客户开心。
    5. 同客户争吵,你永远不会是赢家。

挑选发布日期

  1. 软件功能必须按照优先顺序排序,否则一切将会变糟。只要你一不注意,你手下的程序员就会按照趣味性的顺序开发各项功能,你就将因此无法按时发布软件,或者无法取消部署某项功能,因此你就会陷入很被动的局面。
  2. 市场分割,即根据你的客户愿意支付的价格将他们分成不同的组,从每个客户身上赚取最大的消费者剩余,是一种有效的定价手段。但是长远来看,这种价格歧视会对你的产品形象产生显著的负面影响。
  3. 当消费者对商品所知有限时,消费者通常就会认为比较贵的商品就是质量比较高。
  4. 当你在制定价格时,你就是在发出信号。

修订软件

  1. 如果通过测量某些无意义的静态指标来改进工作,那是无用的。我们真正需要的是一个能够不断改进工作质量的流程:先询问五个为什么,找到根本性的原因,告诉客户为了防止类似故障再次发生我们所采取的举措。书写一份标准、详细的操作流程和确认清单,所有操作步骤都严格按照流程一一操作。目标的:我们遇到的所有引起服务中断的故障都是真正由于极其罕见的、无法预料的"黑天鹅因素"而引起的。
  2. 不要开发那些销售人员无意间答应某个客户的功能,也不要因为"反正迟早要做"而先去开发那些不重要尽管有趣味性的功能。

门后的秘密:卓越管理的故事》是一本薄薄的书,前半部分,作者以讲故事、对话录的新颖形式生动地再现了软件行业技术管理工作的场景;后半部分,作者精心总结了各种工作的管理技巧和实用方法。不管你是管理新手还是老兵都可以学到一些管理技巧。

下面摘录整理了一些读书笔记:

前言

  • 差劲的经理好像总是忙忙碌碌,制造出高效率的假象;中等水平的经理能够完成工作,但却不一定是应该做的工作;卓越的经理不仅会达到工作目标,还能够培养员工。
  • 敏捷项目团队可以管理自身的工作——为工作任务分配责任负责人、监控项目进展并且解决问题,这样经理就可以解放出来,将工作重点放在清除团队进程中的障碍、解决更加重大的问题上。
  • 管理者会放大他人的工作结果,所以,失败的管理所耗费的人力资源成本甚至要高于经济成本。有些对组织至关重要的人选择离开团队,正是因为他们拒绝与差劲的经理共同工作,因为这些经理挫败团队士气、降低团队的工作效率。
  • 管理者要与各种类型的人进行交流,这些人性格不同,技术水平不同,动机也不一样。因为这些交流大部分都是一对一的面谈,或者经理们聚集在会议室里关起门来讨论问题,所以其他人无法知晓这些工作是如何进行的。

了解部门成员和工作

  • 要想领导他人,首先要先了解他们。当你进入一个新的组织或开始新的工作时,首先要知道三件事:

    • 这些人是谁,他们的优点和兴趣是什么,他们正在从事什么工作;
    • 团队的既定任务以及该团队如何产生价值;
    • 你的团队是如何与整个组织机构相契合的。
  • 通过一对一的面谈,你的员工会了解你对他们的期待是什么。你肯花时间与他们相处,会让他们觉得你非常重视他们。

  • 不建议大家整天坐在员工的办公室里监视他们的工作。这种做法,往好了说是令人生厌的微观管理法,往糟了说,是导致团队的生产效率下降的粗暴干预。

  • 对下属进行人性化的关怀。当有人称赞在自己的上司时,说的第一句话就是:”它很有人情味,非常关心我。”

  • 如果办不到,就不要主动提供帮助。

  • 多重任务处理:

    • 同时进行两项相关的工作或任务时,工作效率和生产率可以得到提高。因为当一个人做一项工作的时候,可以将思维转到另一项工作上去。当他们做第二项工作时,其实思维还是会不自觉地停留在第一项工作上,这样就有可能会突然闪现出一个好的想法。人们同时进行两项细节大致相同的工作时,工作会更加有效率。因为他们不会闲坐着,而且两相类似的工作可以相互促进。
    • 但是随着项目数量的增加,给工作效率就会降低。因为项目到项目之间的转变需要时间——人们需要时间归纳整理,弃旧迎新;需要时间来重新形成一连串的想法,并将想法重新组织和重新安置。项目越多,越来越多的时间就会花费在转变上,而不是用在有效率的工作上。
  • 你的团队很容易就会从事一些未经批准、无经费甚至毫无意义的工作,这种情况很常见。只有当你全盘了解团队的工作内容,已经清楚你的团队如何为该组织增加价值的时候,你才能决定工作的优先顺序,才能知道应该做什么,不应该做什么。

  • 向每一位团队成员了解情况,了解他们到底在做什么,掌握他们的全部工作内容:

    • 项目工作:具备起点和终点,并且满足特定的组织目标。
    • 临时性工作:起因无从说起,可能是由于一次危机、一个意外的要求,或者是计划外的其他工作。
    • 持续性工作:指那些维持业务运转的工作。
    • 周期性工作:在可知的时间段出现的工作。
    • 管理工作:涉及剩余工作的计划和组织工作,如:招聘员工、员工发展以及留住人才,预算和报告工作,影响力通过团队工作创造价值。

拨乱反正

  • 了解每个人正在从事什么工作,分清工作的优先顺序,并且仅挑选那些帮助整个团队或组织实现最终目标的工作。
  • 将项目归类。制定出完整饿项目列表后,参照部门目标,重新审视每一个项目,归为以下四类:
    • 确定要继续开展的项目和工作。
    • 确定要停止的项目和工作——即”不做”名单。这些工作对组织中的任何人都无价值可言。即刻停止。
    • 可能是重要的项目和工作,但并不适合你的团队。对这些工作,不能只是停下来,无人问津,需要将它们转交给其他更适合的团队。
    • 你不知道适合哪一个团队去做的项目和工作。这类工作你不知道应该将其归在第二类还是第三类工作中。进行是深入调查,然后再决定是停止还是转交。
    • (就第三类和第四类工作,与你的上司进行讨论,并作出决定。与你的上司一起将不具有重要战略意义的工作——你不该做的工作——进行重新分配。是应该在他人接手前继续做这类工作,还是应该立刻停止?与你的上司和其他需要知道此情况的人就此进行交流,慎重地作出决定。)
  • 提供反馈信息。有时候人们工作表现欠佳,但没有人告诉他们。如果没有人提醒他们,他们根本就不知道需要做出改变,就更不用说在哪些方面做出改变了。不要急着下结论说某人工作表现不好,而要先检查自己的工作有没有做到位。你有没有明确的期望值,确定在某一合理的时间内可交付的成果,并且有没有就结果的质量表明你的态度:满意,或者不满意。
  • 员工的表现还会收到环境和管理水平的影响。在你下结论认为某人”工作表现欠佳”之前,请先审视自己是否提供了这名员工成功所具备的环境。请思考以下问题。
    • 我是否向这名员工说明哪些工作要优先去做,这样他才能合理地安排工作顺序?
    • 我是否让这名员工用自己的语言重复我的期望,以确保他确实明白了我的意思?
    • 分配工作时,我是否清楚的表达出这项工作的约束条件和特定界限?
    • 我是否给出了明确具体的反馈信息来帮助他根据我的期望做出改变?
    • 我是否和他讨论过应该学习一些必要的技术,并为此提供选择?
    • (假如这些工作你都做了,这名员工还是不能给出你想要的结果,那就再看看环境方面的因素——工作程序、工作方法和奖金,还有系统问题。)
  • 设计行为描述问题。“当你⋯⋯的时候,是怎样的情况”,这种行为描述问题可以帮助应聘者描述之前的的工作情,而不是阐明他们想要如何工作。而“如果发生某某情况,你会怎样做”这类假设性问题,应聘者给出的答案实际上并不是他们应对此种情况时的真实反应。
  • 团队成员知道他们要做什么工作,然后就去做。他们不需要也不想要上司每天都来指挥他们工作。上司的主要职责是去铲除障碍、对员工进行辅导以及开发团队的潜力。这不是魔术,如果上司使用某些技巧帮助员工认清工作状态——计划中的工作、进行中的工作和完成的工作,员工就知道应该做什么工作,然后去做。

团队建设

  • 针对工作上的低效表现,或者敏感的人际关系问题给出反馈意见,是非常困难的。为此种谈话做准备会让我们感到非常紧张。但无论如何,这项工作是管理人士必须要做的。因为不能成功地给出反馈信息所造成的损失,要远远超出给出意见时暂时的不舒服。不能成功给予反馈信息的管理者会丧失信任,将工作效率,问题会恶化,同时也树立了仇恨。
  • 及时给出反馈意见:
    • 人们都想要把工作做好,只是很多人并不知道该做什么或者如何做。这时,就需要有人进行指点,告诉他们哪些工作是正确的,哪些是并不奏效的。。你的反馈信息可以帮助他们改进工作。
    • 尽可能及时地给出反馈信息。等到年底的工作总结时再给出反馈意见并不能起到帮助作用。即使是等到季度末或月末,也不妥当。如果你总是等待给出反馈意见的正式机会,那就说明你给出反馈意见的频率不够。经常给出反馈意见不会让人出于意料,而人们很讨厌这种出其不意的反馈。
    • 描述行为或者结果。交谈时,你选择的言辞会极大地影响到对方能否真正理解你的意思。在进行纠正或者加强反馈意见时,语言要具有描述性,“好样的”或者“不错”这类言语,并不能告诉人们哪些工作是正确的。概括性词语并不能帮助你阐明自己的观点——只能让对方感到难过。人们更愿意接受详细的信息,用详细信息来开始对话。不要说“你的工作非常马虎”,可以说“我注意到在上一次的发布记录中,出现了很多拼写和打字错误”。

逐日管理

  • 员工清楚地知道公司和部门的任务和目标后,才能确立合理的个人目标。如果不知晓这一大前提,在制定个人目标时,很容易就会只考虑个人利益和喜好,而忽略了整个组织的需要。
  • 就团队目标而言,跟进执行效果会让下属知道这个目标是非常重要的。如果你对行动计划的执行过程不闻不问,那么其他人就会认为这个目标和行动计划并不重要。
  • 指导是一种帮助。对下属进行指导,不单单意味着给他们解决问题。通过你的指导,下属应该可以看到更多解决问题的方法,并从中选择出最终方案。你的指导应该可以帮助他们培养新的能力。
  • 要讨论利益,而不是立场。在谈话前,你可能已经想好了某种解决方案。但不要在谈话一开始就向对方阐明你的解决方案,要首先向对方说明解决此问题后,会给你们双方带来什么利益。一种解决方案代表一种立场;你的目的——你想要实现的目标——只能代表你的利益。应该找到双方的共识,这样你就可以谈论你们的利益。反过来也是一样。通过对利益进行讨论,可以找到双方的共识。
  • 做一个出气筒:
    • 确定一个处理过激情绪的过程模式:询问详细的事实情况和对此情况的理解;询问可能出现的正面结果。明确说明,向组织里的其他人发牢骚、发表评论是起不到任何作用的。
    • 你可以说“我听说这件事让你感到非常生气”来表明你已知道对方的感受。这种同情的方式没有必要表达出你的赞同、看法或者你自己的诠释。
    • 但是如果情绪的发泄成为一种固定模式(总是对某一个人或者某件事不满),这就是另一个问题了。要对此提供反馈意见,并指导该员工这样做会造成怎样的影响。如果有需要,可以建议他求助专业咨询意见。

发现潜在问题

  • 可持续的步伐

    • 不管表面现象是什么,当工作任务太多,时间不够充裕,以及员工(技术人员或者管理人员)想要一下子完成所有工作的时候,他们就会筋疲力尽。这种状态,特别是管理人员筋疲力尽的状态,会拖垮整个团队。
    • 避免筋疲力尽的方法就是一次只做一项工作——杜绝同时处理多项任务,并以可持续的步伐工作。
    • 大多数人每周可以工作40~45小时,来保证以可持续的步伐工作。偶尔一两周的周工作时间超过40小时是可以的,但这种情况不要超过两个星期,否则你就会感到筋疲力尽,不断地犯错误,工作效率也会下降。不要认为周40小时是娇气的表现。这是一个聪明的商业决策。你有责任保证以克持续的步伐工作。
  • 我们应该确定工作的优先顺序,这样就不会接到一件工作,就立刻去做,也没必要力争完成每件工作。确定工作的优先顺序,做到要事优先,对合理地配置员工是十分重要的。更重要的是,他可以使我们专注于正确的工作——对促进公司发展更具价值的工作。

能力培养

  • 如何分配工作?
    • 决定可分排的工作。对管理者来说,分派工作是初级技术。首先思考分派技术类工作。分派完技术类工作后,再看管理类工作:看看哪些工作是全局战略性工作,哪些是策略性工作。举个例子,做管理报告的时候,选择衡量指标就是战略性工作;收集数据信息就是策略性工作。策略性工作适合用来进行分派。
    • 寻找有能力完成工作的人。思考团队成员的技术和抱负,找到与待分派工作相匹配的员工。思考发展机会:如果团队中的某名成员想要担任领导角色,那这些策略性工作可能会是了解管理角色的好机会。(大部分的管理工作都属于全局战略性工作,但就有志于做经理的员工来说,从策略性工作做起,慢慢开始从事更多的战略性工作可以减少学习过程中走的弯路。)如果你的下属中,没有人具备完成此项工作的技术或者兴趣,那就考虑是否需要更多人手。
    • 把分派任务看成是一种投资。分派任务的结果不是立即就会显现出来的。不要期待别人接受新工作时,一下就能达到百分之百的工作效率。除非这名员工具有此类工作的相关经验,,否则他可能不知道如何处理这项工作中的某部分内容。这时,你就应该进行指导。最终,你的这项投资(指导)会提高这名团队成员的能力,并降低失败的风险,因为他对这项工作的内容已经充分了解了。
    • 思考你想要的具体结果。你心里可能有某个想要的具体结果,或者在某一范围内的结果你都可以接受。你应该与接手工作任务的员工沟通任务参数,包括时间和质量。注意,要关注结果,而不是方法。指导员工如何工作是一种微观管理法。将你的工作分派给其他人是需要勇气的,同时也需要信任。你必须相信对方能够很好地完成工作,即使他做的没你那么好,或没你那么准确。
    • 检察工作进程。要定期检查工作进程。对经验尚少的员工,可以经常进行工作检查;对经验丰富的员工,就可以降低检查的频率。要对他们的工作给予鼓励,提供反馈信息,如果有需要,还应提供帮助。
  • 人们取得成绩时,都希望被别人注意到,并渴望得到赞许。别说“这是他们应该做的工作”,工作很艰难,所以当下属表现优秀时,让他们知道你注意到了。定期的赞许是留住最佳员工的重要因素。每周都要关注每名员工的工作,并对他们的成绩表示赞许。
  • 很多刚刚成为经理的管理人士都是身兼二职:承担管理职责的同时,继续从事技术工作。他们不可避免地在管理类工作和技术类工作之间挣扎斗争。这样,对于经理本身和这个团队而言,失败的可能性就会大大增加。
  • 为团队成员提供职业发展的指导?
    • 杰出的经理会为每一名员工的职业发展提供帮助。帮助员工发展技能以及实现他们的目标,可以提高整个组织的能力。支持员工的职业发展,可以让他们知道你关心他们,而不是只关心他们生产出来的产品。
    • 当你帮助员工实现了他的职业目标后,即使他离开你的部门很久之后,都还是会记得你。我们帮助过的人,反过来给我们做过很好的工作,而且其中很多人已经成为了受人尊重的同事。相反,如果你阻碍员工的发展,他们也会记得——而且时间更长。
    • 不要阻碍员工的发展。有时候,你无法使员工成功转型到另一个角色——在你的部门里不存在这个角色。如果是这样,这名员工可能会调到另一个部门工作,甚至会跳槽到另一家公司,你要做好准备。不要阻碍员工的发展,也不要等待另一个人来填补这个职位。职业培训有时意味着帮助员工找到一个新的职位。如果你为了方便自己的工作,而阻碍员工的发展,那么从长远角度看,结果往往是事与愿违的。

有效地应对变化,不折腾

  • 有时候我们会自己给自己制造麻烦。我们不想激怒上司,因此不敢直接说“不”。避免给自己挖坑,考虑以下几种可能的答复方式:
    • 对明知无法达成的任务,我无法给出承诺。我想某某工作是我们可以完成的。
    • 我会和团队一起努力,看看我们能做到什么程度。
    • 我们会首先攻克最重要的功能,每个月向你汇报我们的成果。
    • (这样说,接下来的谈话气氛很可能会不太和谐。但是你和你的上司都会面对现实。如果迟迟不讲明现实,只会暂时推迟痛苦,为达成商业目标可供选择的方法数量也会减少。)
  • 组织里的高层或者其他团队可能会希望你表现得像个英雄。但是接受超出你能力范围的工作并不是英雄主义,是殉难。当你接受无法应对的工作时,你就承担了所有的危险(总的来说,没有任何回报)。
  • 避免仓促的决定。当高层通知你计划有了180度的大转变时,他们往往会希望你立刻就答复说可以按新计划完成工作,而你也很容易就会冒这个险。一些“简单”的答案——增加人手、加班工作、同时进行几个项目、“打破常规”⋯⋯都不会奏效。在你和团队成员进行讨论之前,不要给出任何承诺。
  • 重新考虑选择余地,尽早做出回复。尽量在一两天内给出答复。对于一个正在承受巨大压力的高层来说,这样的期限已经是极限了。要承诺在这个期限内给出你团队的讨论结果。
  • 用事实代替流言。当你听到某个流言,而它又影响到你的团队时,一定要调查清楚。不要任凭大家处于焦虑之中,或者用他们的担忧来填补缺失的信息。一旦你了解到事实后,就马上告诉你的团队,并带领团队努力适应改变。
  • 什么是管理?
    • 坚持进行易理解但难操作的管理练习。
    • 给员工以人文关怀。
    • 与其他经理共同合作,作为一个团队来工作。
    • 树立共同目标。
    • 阐释目标。
    • 为成功下定义。
    • 处理高优先级的工作。
    • 帮助大家有效率地合作。
    • 制造信任的气氛。

读完了《自我训练》,是一本帮助认识焦虑的好书。它教人学会接受自己的不完美,坦然面对情绪,逐步放松心情。每个人都值得一读。

下面摘录整理了一些读书笔记:

  1. 安全感始于你相信自己的意愿(期待定律)。
  2. 缺乏耐心,就像消极情绪一样,会将你吞噬,两者都是毒药。
  3. 区别“想要”和“必须要”的不同:
    1. “想要”受自我满足的愿望所驱动,并非是任何外在的、控制所驱动的动机。
    2. “必须要”受不安全感所驱动。是强迫性的、顽固的努力,想要尽一切努力让自己感觉更有控制力。
  4. 四种人格特征:
    1. 刺猬型人格(敌意)
    2. 乌龟型人格(逃避)
    3. 变色龙型人格(操控)
    4. 完美主义型人格(过分要求)
      1. 完美主义通常并不是渴求完美,只是为了避免不完美。如果不完美让你感觉焦虑,那么你的生活有可能受到了条件反射式的思维的控制。
      2. 狂热型完美主义所追求的是通过消除所有的错误,而使自己变得没有弱点,而且对生活中的每一个方面都具有典型的强迫症状、做事过头。一个小故障、一次失言、一次挫折都会让你沮丧和焦虑 ,想要赶忙重新控制自己的领域——要是不完美,就永远都不会快乐了(非此即彼的思维)。
  5. 孩子气的特点是受到威胁的时候就会强化自己的破坏作用。因此,评估你心中的孩子气在什么年龄段,这很有用 。
  6. 所有的事情都是有选择的,要学会如何发挥你的意志。
  7. 不安全感+控制=毒药混合剂
    1. 不安全感会导致人想要对生活有所掌控。但消除焦虑和抑郁(不安全感)的关键不是更多的控制,而是培养自信,相信自己可以应付生活展示在我们面前的各种挑战。
    2. 焦虑和抑郁都是生长在不安全感这片肥沃土地上的杂草。它是一种由于不安全感而滋生出来的习惯,这种习惯会歪曲你对生活的看法和体验,逐渐耗尽你体内的化学成分。
    3. 并不是生活带给我们的种种挑战导致了临床上的焦虑或是抑郁,而是我们在面对挑战时所做出的反应导致的。
    4. 生命不是用来控制的,而是用来释放的。越没安全感,越怀疑生活,就越想控制生活,而不是去信任生活。
  8. 不安全感的三种声音:
    1. 怀疑
    2. 恐惧
    3. 消极
  9. 常见的思维陷阱:
    1. “要是怎样”的预见思维
    2. “不得不做”的强迫思维
    3. “非此即彼”的冲动思维
    4. “ 读心术 ”般的主观臆想
  10. 强迫症(OCD)
    1. 是由不安全感所引发的,不相信自己,不相信自己的行为和思维,所以也无法相信自己的记忆,觉得不安全(不能够掌控),并造成焦虑。
    2. 两个要素:反复出现,持续不断。侵入脑海的想法使得焦虑增加,让人感觉非要重复某个行为,或是反复出现某个念头,才能重新获得对生活的掌控,这稍微舒缓了自己的焦虑,但却没什么满足感。
  11. 自我交谈的3个步骤:
    1. 将事实与想象分开,学会倾听内心。 ( 焦虑和抑郁都不是以事实为基础的,而是由于错误和歪曲的认知而产生了捏造的想象。)
    2. 摆脱条件反射式的思维模式。
    3. 随它去 (Let it go)。当情绪来袭,不要被胡思乱想,或是说服自己非要做些什么(控制念头),可以尝试转移注意力。活在当下,感受各种感觉、印象、声音、味道和景象,想得更少,感受更多,这就是“随它去”的方法。你会及时地感受到越来越多的头脑之外的生活。
  12. 自我训练的10个原则:
    1. 每个人都会有不安全感。
    2. 想法先于感觉、焦虑和抑郁。
    3. 焦虑和抑郁是被误导的、想要控制生活的尝试。
    4. 控制是假象,不是解决问题的办法。
    5. 缺乏安全感是一种习惯,任何习惯都可以改变。
    6. 健康的思维方式是一种选择。
    7. 一个好的教练也是一个好的激励者。
    8. 你必须要挑战“别的人才能拯救我”的荒唐想法。
    9. 你必须承担起改变的责任。
    10. 你必须深信,自己真的有选择。

这本日本设计师写的书,从空间 > 信息 > 思考的三个维度逐步递进的介绍了一些整理之道。薄薄的一本书,有些观点还挺有意思的,可以一读。

下面摘录整理了一些读书笔记:

解决问题的“超级”整理术

  1. 当思绪没有任何阴霾,焦点凝聚于目的,逻辑自然畅通无阻。
  2. 若能向对方条理分明地阐述自己采用该设计的心路历程,彻底整理自己的思考路径,作品自然不再混乱不清。
  3. 整理时,不可失去客观的角度。如果不与标的保持距离,冷静详察,就无法针对大量要素设定优先次序,毅然舍弃多余内容,逐步将焦点凝聚于重要的关键,细细琢磨,成为简练利索的有形之物。
  4. 要创造一个设计,就必须彻底整理目标对象,找出最重要的关键——本质,再将它化为有形之物。
  5. 本书阐述的“整理术”,并非为了整理而整理,而是一种“如何享受舒适生活”的根本方法论。

一切从整理开始

  1. 整理术三阶段:

    1. 空间(学会如何设定优先排序,认清重要事务)
    2. 信息(导入观点,掌握信息之间的因果关系)
    3. 思考(整理人类思绪,引导并组合,最终可视化)
  2. 整理术步骤:

    1. 掌握状况

      1. 信息不可视的状态
      2. 将信息可视化
      3. 列出信息
    2. 导入观点

      1. 设定优先排序
      2. 理清因果关系,找出本质
    3. 设定课题

      1. 本质是正面的,则琢磨使之发亮,强调原本任其埋没的优势
      2. 本质是负面的,则进行反向思考,将负面扭转为正面,找出魅力所在。
  3. 掌握状况之后,为了查明问题本质,必须理清信息的因果关系。在掌握状况的阶段,各种信息呈现混乱不清的堆积状态,务必将这些信息相互对调,设定优先排序,舍弃多余信息,排除含糊暧昧的部分,找出关联性,整理成具有整合性的信息。

  4. 基于宏观视野理清信息的因果关系,就能认清前进的方向。

  5. 认清混沌的现状,保持解决问题的心理准备。同时,随时保持穷究问题本质的积极态度,才是整理术的最大前提。

第一阶段:“空间”整理术——设定优先排序

  1. 定期更新→防止东西增加。
  2. 决定物品的固定位置, 使用后立即物归原位→保持作业环境清爽。
  3. 决定“外框”,统一规格,成为某种套件→简单明了地进行分类。通过决定外框、统一规格,让分类更加简单明了。如此不但可将不同种类的东西收拾干净,而且是容易掌握的简约系统。

第二阶段:“信息”整理术——导入个人观点

  1. 退一步客观检视。
  2. 舍弃自以为是、想当然 。
  3. 转换观点,从各种角度观察。

第三阶段:“思考”整理术——将思绪信息化

  1. 将自己和对方的思绪置换成语言。
  2. 建立假说,大胆向对方提问。
  3. 思考时要对于别人的事情视如己出。