从哲学的视角看待项目生命周期——构建不一样的世界

前言

徐小宝:本文以哲学的角度去剖析项目生命周期中各个环节,如有表述有误请留言指正 ! ! !

万事万物都存在着或紧或密的联系,这种联系难以被斩断,且由于涉及不同事物间的联系,有时这种若隐若现的联系很难被察觉,而一旦你找到其中的一丝联系,以此为入口,便会发现辽阔而美妙的世界。


一、“桥” —— 通往另一世界彼岸的联结

1、什么是“桥”?

照常理而言,不同世界之间就像是两个彼此不认识的陌生人毫无联系,若两个不同阶级的人之间存在着不可逾越的鸿沟。此刻,会发现常理与前言所述有所出入,所以便打破常理,打破以往的认知,通往另一个世界。因此,哪怕是两个彼此不认识的陌生人,也会存在一丝联系,正如“六度分离理论”所说:

在人际交往的脉络中,任意两个陌生人都可以通过“亲友的亲友”建立联系,这中间最多只要通过五个朋友就能达到目的。

而这样一丝联系需要你去寻找发现,而这种联系我称之为“桥”。

2、构建联结世界间的映射关系

无论是不同的人、不同的事物,亦或是不同的世界,只要找到了那座“桥”,便找找到通往另一世界彼岸的联结。当你找到了这其中的联系后,就可以构建两个世界之间的对象映射关系(Object Relational Mapping,简称ORM),也就是一个世界事物在另一个世界的投影,这种映射只存在于不同世界之间。正如三维生物在二维世界的映射就是影子,在一维世界的映射就是原点。

通俗来讲,两个世界的映射关系大多数是一一对应的,也会存在多对一的映射关系,且单一事物在同一世界的映射是唯一确定的。

如上述举例的三维世界,只与单一维度的世界做联结映射的时候,只存在一个结果,而与多个维度的世界做联结时,便存在多个映射结果。这种维系不同世界的联结便是“桥”,而“桥”的存在构建了不同世界间的映射关系

拿程序员经常接触的计算机举例:人与计算机是两个世界事物,显示器充当了“桥”的角色,让彼此有了联系,让人可以读懂计算机的心思。而显示器输出的图像与计算机也是两个世界事物,这时候需要拆解计算机组成,充当“桥”角色的重担落在了CPU、GPU身上,二者通过计算将二进制信号转换并最终形成了图像。所以,一个世界在另一世界不会无缘无故产生映射,不同世界产生映射必然存在“桥”,而“桥”本身也可能是一个独立的世界

二、面向对象编程 —— 构建现实世界与编程世界的“桥”

1、什么是面向对象编程?

面向对象编程(Object-oriented Programming,简称OOP),将相关联的属性及其操作封装为一个对象(Object),而这个对象从另一角度来看也像是一种数据类型。所以,从概念上来讲面向对象编程和抽象数据类型ADT(Abstract Data Type)的理念相关。而面向对象编程这一理念搭建了现实世界与编程世界的桥梁,让每一个现实世界的事物在编程世界都有了与之对应的映射,也就是Class,让编程开始不再突兀变得容易理解,让编程世界与现实世界有了关联。

2、面向对象编程理念的发展史

最早将面向对象编程的理念融入编程语言的是1973年发表的Simula 67,其被称之为第一个面向对象语言。在此之后Barbara Liskov在1975年发表了CLU,一种基于对象(Object-based)的编程语言,其在1987年提出了面向对象设计(SOLID)五大原则之一的里氏替换原则(L)

里氏替换原则:派生类(子类)对象可以在程式中代替其基类(超类)对象

1983年第二个面向对象语言Smalltalk被艾伦·凯(Alan Curtis Kay)提出,这门语言引入了更多面向对象的概念,引发了面向对象语言的热潮,如C++C#Objective-CJavaRuby等。从此,面向对象编程成了现代编程的重要理念(范式)之一。

三、从哲学的视角看待项目生命周期

项目生命周期是一个项目从概念到完成所经过的所有阶段。所有项目都可分成若干阶段,且所有项目无论大小,都有一个类似的生命周期结构。其最简单的形式主要由四个主要阶段构成:概念阶段、开发或定义阶段、执行(实施或开发)阶段和结束(试运行或结束)阶段。阶段数量取决于项目复杂程度和所处行业,每个阶段还可再分解成更小的阶段。

这是项目生命周期的基础概念,是一个通俗的认知表象。从哲学的视角重新认知,一个项目其实是由许许多多个不同的世界叠加产生了“项目”这一独立单一的个体(New World)。相同构成组成同一世界,不同构成组成新的个体,也就是新的世界。下面以Java Web项目为例,构建不一样的编程世界

1、项目生命周期之需求世界

需求世界,顾名思义,是一个由需求构成世界体系。这个世界的构建尤为重要,其是整个项目的基石。一旦这个世界出现偏差,轻则项目重整微调,重则项目推倒重来。所以,对于这一世界的构建需要慎之又慎。只有这个世界稳定,才可以逐步构建之后的世界。

在这个世界体系中存在两个小世界,一是以项目经理为首,一是以客户为首,而联结这两个小世界的“桥”便是语言沟通。在这个世界的中心主题就是两个小世界通过不断的沟通交流,最终产生需求。在世界构建初期,以客户为主导地位,项目经理则以倾听为主,最终将客户的想法映射为需求(在这个映射过程中项目经理又充当了“桥”的角色),众多的需求构建了这个需求世界
需求世界
但是,客户大多数并非开发行列人员。所以,往往客户提出的想法是不够成熟或是难以实现的,而这时就需要项目经理发挥沟通技巧了。以下举例一些项目经理需要具备的能力。

  • 谦虚礼让。不能以客户是门外汉强行改变客户的想法,时刻谨记此刻仍是以客户为主导的需求世界,强行改变会让需求谈崩项目谈黄。因此,需要注意语言措辞,晓之以理动之以情,优雅的去拒绝不成熟或难以实现的想法。
  • 合理认知。不能为了谈成项目而无端应承客户的所有要求想法,要对自己的团队的长处短处有一个合理的认知,否则一旦某些需求团队无法实现的时候就会造成项目进程止步甚至是项目中止。
  • 话不说满。在与客户沟通的时候切忌不可说满,“一拍脑袋”的事情往往会让你“一拍大腿”去后悔。不管是拒绝客户,亦或是比较棘手不确定的事情,水舀半瓢给自己给团队给点退路。
  • 换位思考。这是很重要的一点,一是对客户的换位思考,如遇到客户中途修改需求的情况,应站在客户角度考虑提出自己的看法,哪怕是拒绝也是以分析利弊后让客户自己产生“原先的想法是不切实际”的想法。一是对团队成员的换位思考,不能以身居高位为由,随意团队成员。
  • 善于引导。客户的想法往往是分散的,大多时候是缺乏方向的,需要加以引导,否则难以形成一个完善的需求体系,甚至沟通到最后都无法洞悉客户需要什么样的需要实现什么功能。
  • 合理规划。一旦需求确定,对于项目的进度掌控,各成员各阶段的规划一定要切实合理,这样才有利于项目的走向。且谨记,计划始终是计划,存在计划赶不上变化的情况,会有突发情况或不可抗力。因此,规划需要有应急措施(Plan-B)。

需求世界稳定以后,便是向下一世界的构建进发,也就是开发阶段,将需求向程序转变。

2、项目生命周期之程序基世界

在经过项目经理日以继夜的沟通整理构建的需求世界,打下了新世界的坚实基石。而这个新世界“程序基世界”主要是将需求世界的每一个需求映射进来,涵盖数据库的设计、原型的设计、后端代码的设计、前端代码的设计。

从计算机操作系统原理的角度来看,数据库的设计和后端代码的设计像是一个进程,而原型的设计和前端代码的设计像是另一个进程。从软件设计的角度来看,数据库的设计和后端代码的设计是一个模块,而原型的设计和前端代码的设计像是另一个模块。因此,在现代编程中将前后端进行了分离,这是一个解耦的过程,产生了“高内聚 低耦合”这一状态。

从哲学的角度来看,不管是数据库的设计还是后端代码的设计,最终都是将需求转化后面向计算机的。而原型的设计和前端代码的设计则是需求转化后面向人的。存在同一性,但更多的表现为同一事物的不同方向。因此,在程序基世界中又分为前端世界后端世界,这两个世界互不干涉可以同步构建,又存在联系相互影响。

需求转化面向计算机的为后端,面向人的为前端。
引申:前端面向用户的为前台,面向管理的为后台。

程序基世界

Ⅰ、后端世界

后端世界是面向计算机的,所以主要涵盖了数据库的设计和Java程序的设计,这是两个层面的事物。因此,在后端世界中又分为数据库世界Java世界。其中,按照Java三层架构(MVC)设计理念,将Java世界划分为对象层(Model层)、数据访问层(DAO层)、服务层(Service层)以及控制层(Controller层)。

三层架构只是一个理念,MVC是一个理念实践,这两者都只是规程(应用设计架构),可遵守可不遵守,自然也可以部分遵守。

MVC模式

① 数据库世界

数据库世界主要是将需求转化为具体的数据表,这一过程可以看作是面向需求的数据库设计,让需求在数据库世界映射成单一的数据表,将需求的属性映射为数据表的字段。至于最终是使用关系型数据库(SQL Server、MySQL、Oracle),还是非关系型数据库(MongoDB、Redis、Memcache),就看具体的需求实现了。

② 桥 —— 数据访问层(DAO层)

数据访问层是Java世界的底层,是使数据库世界Java世界形成联系的“桥”,而这只是相对两个界面的宏观“桥”。深度剖析数据访问层及数据库世界,从微观角度切入,会发现数据访问层这座宏观“桥”是通过多个微观“桥”组合而成的。其中SQL语句担任数据库表与数据的“桥”,JDBC(Java Data Base Connectivity)驱动器则担任Java世界和SQL语句的“桥”。JDBC驱动构建连接会话(Connection),而后通过构建SQL 语句(Statement)获取数据集(ResultSet),检索数据集取得最终数据对象。

但是,通过传统的JDBC进行数据库的访问会频繁的进行数据库的连接断开、资源使用释放等操作。为了解决这种频繁操作,数据持久层框架应运而生,常见的有MyBatis、Hibernate等。下面以MyBatis为载体进行剖析。

MyBatis,一种半自动ORM数据持久层框架,支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

MyBatis中的Mapper XML文件承载动态SQL语句,是数据库世界SQL语句的映射投影,因此与之一一对应,拥有正常的CRUD操作,可以随意添加各类SQL语句,每个语句都相当于JDBC的Statement对象。

Java世界中的Mapper文件则是MyBatis的Mapper XML的映射投影,因此,MyBatis有多少个Mapper XML文件Java世界就有多少个Mapper文件。其中,Mapper XML文件的namespace属性指向了对应Java Mapper映射,而SQL语句的id属性指向了对应Java Mapper映射中的方法名,resultMap属性为方法映射出参(resultMap中column属性指向数据库表字段名,property属性指向JavaBean的属性名),parameterType属性为方法入参。至此,数据访问层完成了从数据库世界Java世界的映射。

数据访问层的每一个Mapper(即DAO对象,Data Access Object)内部的方法只进行CRUD其中之一的操作,所以数据访问层是原子操作。

  • MyBaits的Mapper XML示例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.dao.mapper.UserInfoMapper">
	<resultMap type="UserInfo" id="TUserInfoResult">
        <result property="userId" column="user_id"/>
        <result property="userName" column="user_name"/>
    </resultMap>

	<sql id="selectUserInfoVo">
        select * from user_info
    </sql>

	<select id="selectUserInfoList" parameterType="TUserInfo" resultMap="TUserInfoResult">
        <include refid="selectTUserInfoVo"/>
        <where>
            <if test="userName != null and userName != ''">and user_name = #{userName}</if>
        </where>
    </select>

	<insert id="insertUserInfo" parameterType="UserInfo">
        insert into user_info
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="userName != null and userName != ''">user_name,</if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="userName != null and userName != ''">#{userName},</if>
        </trim>
    </insert>
    
	<update id="updateUserInfo" parameterType="UserInfo">
        update user_info
        <trim prefix="SET" suffixOverrides=",">
            <if test="userClass != null">user_name = #{userName},</if>
        </trim>
        where user_id = #{userId}
    </update>
    
	<delete id="deleteUserInfo" parameterType="Long">
        delete from user_info where user_id = #{userId}
    </delete>
</mapper>
  • Java Mapper映射示例
package com.test.dao.mapper;

import com.test.dao.domain.UserInfo;
import java.util.List;

public interface UserInfoMapper {
	List<UserInfo> selectUserInfoList(UserInfo userInfo);
	int insertUserInfo(UserInfo userInfo);
	int updateUserInfo(UserInfo  userInfo);
	int deleteUserInfo(Long userId);
}
③ 服务层(Service层)

数据访问层的下一层就是服务层。由于数据访问层的映射结果和服务层同属Java世界,因此彼此之间不需要“桥”维系,也不需要进行映射。所以服务层中的方法及其承载Service对象与数据访问层的DAO对象无需一一对应。所以在一个Service对象中可以操作多个DAO对象,也可以操作多个DAO对象的方法。所以,服务层不是原子操作。

④ 桥 —— 控制层(Controller层)

服务层的下一层就是控制层。但控制层也是后端世界向前端世界过渡的桥梁,因此,控制层与服务层联络的时候同属一个世界,可以很自由,一个Controller对象操作多个Service对象及方法。但与前端世界联络的时候就需要通过“桥”来联结,且“桥”两端映射必须是一一对应的,而这个“桥”便是接口,也就是HTTP、WebSocket协议,因此相同Meothd相同URL的接口只允许存在一个。

后端世界

⑤ 衍生物 —— 对象层(Model层)

对象层(Model层),其更像是一个衍生物,各个世界间相互联系形成的产物。虽然不能另立门户,却是不可或缺的,也是面向对象编程的载体。对象层因为是各环节的衍生物,所以存在很多的类型或名词。如下:

  1. domain,一般为对象层的别名,用于包名
  2. JavaBean,包括POJO及EJB
  3. POJO(Plain Ordinary Java Object)简单的Java对象,是一个中间对象
  4. EJB(Enterprise JavaBean),定义用于开发基于组件的企业多重应用程序标准,分别是回话Bean(Session Bean)、实体Bean(Entity Bean)、和消息驱动Bean(MessageDriven Bean)
  5. DTO(Data Transfer Object),是一种设计模式之间传输数据的对象
  6. Entity,实体Bean,一般是用于ORM对象关系映射,同PO
  7. PO(Persistant Object),持久对象,即持久层
  8. BO(Business Object),业务对象,即服务层(Service层)
  9. VO(View Object),表现层对象,即控制层(Controller层)

图解各名词关系

Java世界中每一个层级之间是递进的关系,如同数据结构之中的链表,后一层访问前一层。但是这种关联是一种弱关联,是人为进行限定的。也就是说如果控制层跨越服务层直接操作数据访问层也是可以的,但不建议这样使用,因为这样将失去了分层的意义。所以,参照链表是创建元素赋值指针指向的操作,后端世界的构建也是按照层级顺序进行依次编写构建的。

Ⅱ、前端世界

前端世界是面向人的,所以主要涵盖了原型的设计和前端程序的设计,这是同个事物的多态化。因此,在前端世界中又分为原型世界视图世界,前者为静后者为动,后者以前者为参照构建世界。其中视图世界以视图(HTML)为主心骨,而CSS与JavaScript为辅臣,三者共同构建了多姿多彩的前端世界。由于前端世界是面向人的,也就是需要和客户进行对接确认的。所以,前端世界的具体构建走向是由客户所决定的。

① 原型世界

原型世界主要是将需求转化为具体的静态视图界面,这一过程可以看作是面向需求的原型设计,让需求呈现出生命力,让其拥有“五官”。此外,原型世界视图世界的参照,一般情况下先构建原型世界后构建视图世界(特殊情况下,可以边构建原型世界边构建视图世界,二者同步映射;紧急情况下,可直接构建视图世界)。一般原型世界的构建使用Aurxe、Sketch、墨刀、Balsamiq Mockups、Justinmind、iClap、蓝湖等,具体使用工具按个人喜好。

② 视图世界(View层)

一般情况下,视图世界是参照原型世界构建的。而视图世界以视图为主,所以没有那么多的划分层级,更多更常见的反而是各式各样的规范,亦或是语言框架。而视图世界的代码编写也是需要依照世界构建规律及事物发展顺序进行的,也就是先搭建HTML框架布局,而后编写内联样式(CSS样式)以及监听事件(JavaScript)。等视图界面定型后再解耦,即样式与容器解耦,将内联样式向外联样式转化。

先写内联样式再向外联样式转变并非是一个多此一举的动作。一是从网页发展的历史进程来看,也是先视图容器 ==> 内联样式 ==> 外联样式 的顺序发展的;二是开发过程中视图容器的样式是变化频繁的,先编写外联样式会让修改流程变得繁琐麻烦,并非所有开发者都将视图世界当作一个整体的,还存在着一部分喜欢将视图世界划分为三个层级或两个层级(CSS一个层级,HTML与JavaScript一个层级)。

前端世界

  • 前端三大主流框架
  1. Vue(读音 /vjuː/,类似于 view)是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
  2. React,是一个用于构建用户界面的 JavaScript 库。React 使创建交互式 UI 变得轻而易举,以声明式编写 UI,可以让你的代码更加可靠,且方便调试。使用 JavaScript 编写组件逻辑而非模版,因此可以轻松地在应用中传递数据,并使得状态与 DOM 分离。React 从诞生之初就是可被逐步采用的,因而可以按需引入或多或少的 React 特性。
  3. Angular,是一个应用设计框架与开发平台,用于创建高效、复杂、精致的单页面应用。
  • 前端三大主流CSS预编译器
  1. Sass / Scss,世界上最成熟、最稳定、最强大的专业级CSS扩展语言!完全兼容所有版本的CSS,拥有比其他任何CSS扩展语言更多的功能和特性。
  2. Less(Leaner Style Sheets),是一门向后兼容的 CSS 扩展语言,和CSS 非常像,仅对 CSS 语言增加了少许方便的扩展,因此很容易学习。
  3. Stylus,富于表现力、动态的、健壮的 CSS。
  • 前端主流脚本语言
  1. JavaScript(简称“JS”),是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。JavaScript的标准是ECMAScript 。
  2. TypeScript,是JavaScript的超集,通过在JavaScript的基础上添加静态类型定义构建而成。TypeScript通过TypeScript编译器或Babel转译为JavaScript代码,可运行在任何浏览器,任何操作系统。
  • 命名规范(举例说明,更多规范自行查询)
  1. 目录命名规范:文件解耦,按模块划分(如组件文件夹components、视图文件夹view或pages等)
  2. 变量命名规范:使用 camel 命名法,且具有具体指向(如 userInfo、newList),常量则全大写以“_”分隔,涵盖函数的形参
  3. 方法命名规范:使用 camel 命名法,且有具体指向性(如 onClick、showLoading)
  4. CSS命名规范:一是OOCSS(面向对象CSS命名规范),类比CPU精简指令集;一是BEM命名规范,Block__Element–Modifier(如 .user__btn–click)
  5. CSS选择器规范:复用组件优先使用class类选择器,唯一组件使用id选择器
  6. 视图命名规范:单文件组件首字母全大写(如HelloWorld),复用组件全小写以“-”连接(如m-check-box),自定义事件全小写以“-连接”(如box-click),优先使用单闭合标签等
  7. JS语言规范:变量定义尽可能使用 let、const,避免使用var(存在变量提升及污染全局变量等风险);优先使用箭头函数(反应了变量的变化过程,但不存在全局this,在声明时就绑定了作用域);单页面优先使用全局变量 that_this 指代全局 this,组件优先使用全局变量 self_self 指代全局 this;优先使用单引号及反引号,避免使用双引号,Object等K-V结构的数据结构key不使用引号,HTML、CSS、JSON中优先使用双引号,语句结束使用分号结尾;优先使用模板字符串取代连接字符串;必须先定义变量再使用

所有规范都仅仅是规范,也就是约定俗成的东西,可遵守可不遵守,自然也可以部分遵守,按个人喜好。

3、项目生命周期之测试世界

Ⅰ、功能测试世界

  1. 业务测试。功能测试的测试目的是对项目的各功能是否符合需求进行验证。
  2. 功能测试。业务测试的测试目的是对项目的操作是否符合业务的逻辑流程。
  3. 接口测试。业务测试的测试目的是对项目的接口是否符合设定的输入输出。

Ⅱ、性能测试世界

  1. 负载测试。负载测试是通过逐步增加系统负载,测试系统性能的变化,并最终确定在满足性能指标的情况下,系统所能承受的最大负载量的测试。其中还有一种特定类型的负载测试,它是通过逐步增加软件系统的负载,测试系统性能的变化,并最终确定在什么负载条件下系统性能处于失效状态,以此来获得系统提供的最大服务级别。
  2. 压力测试。是给软件不断加压,强制其在极限的情况下运行,观察它可以运行到何种程度,从而发现性能缺陷,是通过搭建与实际环境相似的测试环境,通过测试程序在同一时间内或某一段时间内,向系统发送预期数量的交易请求、测试系统在不同压力情况下的效率状况,以及系统可以承受的压力情况。
  3. 并发测试。并发测试通过逐渐增加并发用户数负载,直到系统的瓶颈或者不能接收的状态,综合分析交易执行指标、资源监控指标等来确定系统并发性能的过程。
  4. 环境测试。环境测试主要是对程序在不同生产环境之中的表现是否一致,通俗的来讲就是兼容性测试。如手机软件就会对苹果系统、安卓系统(华为、小米、VIVO、OPPO等)等进行测试,看不同环境下的表现是否一致。

Ⅲ、安全测试世界

  1. 渗透测试。渗透测试是通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析,这个分析是从一个攻击者可能存在的位置来进行的,并且从这个位置有条件主动利用安全漏洞。对生产服务器、数据库、程序、网络设备进行渗透。常见的如SQL注入、XSS攻击等等。
  2. 安全测试。安全测试是对项目进行检验以验证产品符合安全需求定义和产品质量标准的过程 。负责搭建软件安全环境和数据安全环境的。

4、项目生命周期之运维世界

Ⅰ、环境部署世界

准备项目生产环境所需的基础,如生产服务器、域名、SSL证书等。了解测试环境及生产环境的配置,将通过测试后的项目移植到生产服务器上,或是通过容器虚拟化技术进行无障碍移植。

Ⅱ、运营维护世界

主要保证项目在生产环境中稳定运行,出现运行问题时定位并解决修正问题(Bug)。对突发情况对出对应的措施,对项目运行过程中的运营数据进行汇总分析。了解项目的业务流程,对项目进行重发布或升级。

四、从哲学的视角看待重构

1、什么是重构?

重构(Refactoring)就是通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。

以上是重构的书面解释,很显而易见,重构就是优化程序代码,有且仅有这样一个目的。重构,这个词汇伴随着整个程序基世界一起行进,甚至是走完整个项目生命周期依然能看见重构的影子。那么,从哲学的视角怎么看待重构?在哲学中有这样一个词汇很重构很像,那就是“永恒轮回”。

重构在整个项目生命周期之中就像是不断轮回的存在,哪怕是项目最终交付,周而复始,总会在某一个时刻出现。所以,用“永恒轮回”去指代重构再合适不过了。在每个轮回中对代码进行重构,以使得程序性能逐步最优化。所以,重构一直在路上

因此,不要想着一次性就把程序代码写到最好。一蹴而就,永远是个幻想。好的代码都是从差的代码一步一步的重构出来的,而你的开发经验只是减少了重构的次数。哪怕是你现在所用的编程语言,它也是一个一个版本的更迭之后的产物。所以,在程序员的世界里,要学会脚踏实地,夯实基础,切勿盲目自信一步登天。

2、为什么要重构?

  • 重构可以改进程序设计架构
  • 重构可以使程序更容易理解
  • 重构可以帮助解决程序BUG
  • 重构可以提高程序运行性能

五、从哲学的视角看待管理

1、什么是管理?

管理是指一定组织中的管理者,通过实施计划、组织、领导、协调、控制等职能来协调他人的活动,使别人同自己一起实现既定目标的活动过程。是人类各种组织活动中最普通和最重要的一种活动。

管理,从哲学的视角就是一个升维的过程(提升自我所在层级)。从表象上来看,管理者与被管理者之间是一个上下级的关联。从本文的理念来看,二者属于两个不同的事物,也就是不同的世界(层级)。那么,不同世界之间联结就需要找到其中的“桥”。但是,这在实际过程中是个极难完成的一件事。

从宏观上来讲,确实只存在两个世界,一个管理者世界,一个被管理者世界。但从微观上来讲,被管理者世界中,每个被管理者都是一个独立的个体,都具有独立思考的能力。正如“一千个读者有一千个哈姆雷特一样”,这个被管理者世界是由若干个被管理者小世界聚合而成的。这时会发现,想要建立两个世界的联结,变成了要建立若干个与小世界的联结。一个“桥”或许耐心一些可以找到,但若干个“桥”全找到的事件概率实在是微乎其微。

或许有人会说使用管理学的那些管理思想、方法及技巧,或者是无视部分被管理者只要整个团队是相对稳定可控就行。但这样的做法往往是事与愿违,甚至是出现消极对抗。都说“暴政之下,必有暴民”,所以,这样的一个理念是错误的,或者更严谨的说在我的体系之中它是错误的。

2、深入剖析哲学视角下的管理

上面提到,管理从哲学的视角就是一个升维的过程。那么,该怎么理解升维这个概念呢?首先,既然存在升维,那么自然也就存在降维。管理者与被管理者本就是两个世界的人,所以管理者如果只是单纯的站在自己的世界,以权居高临下正面硬刚,最终只会迎来对抗。这种表现在空降的管理层中表现尤为明显。

所以,正确的方式应该是管理者将自己拉下神坛,从上层到下层,也就是一个降维的过程。降维之后的管理者与被管理者处于同一个世界,而同个世界之间不需要“桥”的联结,自然省事不少。常用的降维方式,如换位思考、团队聚餐、团建等等。

但是,管理者始终是管理者,不能在下层扎根。所以,在降维之后需要进行升维,也就是回到上层,哪怕是升维只是进阶了半个维度,那也是上层,只要是上层就拥有了身位相匹的管理权。而升维大抵就是建立个人威信,也就是所谓的“生活是生活,工作是工作”。在工作中保持严谨威严,在生活中保证平易近人,让管理阶级在无形之中形成。

以农民起义军为例,各阶层管理者大多不是一开始就是管理者。他们起初也只是一个小兵,只是在同阶层建立了一定的威望,从而使自己的维度提升,晋升管理阶层。而威望越高,提升的维度越多,自然晋升的阶层也就越高。那么,对于一个程序员的管理者而言,自身能力一定是首要的。

六、结语

不同世界之间一定存在某个联系,通过这个联系可以更深入的去了解新世界的一切。不同世界通过“桥"联结后的映射大多数是一一对应的,也存在多对一的映射关系。正所谓大道至简,万物殊途同归。只要你耐心寻找,找到每个世界之间联结的“桥”,你会发现世界是如此的简单,且如此美妙。正如哲学所言,世界具有统一性

哲学视角下的项目生命周期

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值