昨天微信刷新闻,看了一篇文章,关于《软件开发为什么还是这么难》,有点感触,这里给伙伴们唠叨几句。
文中说现代的编程语言已经进化的很优秀了,按理说软件开发应该没有从前那么难了,但是为什么现在的软件开发依然很难呢,列举了很多观点,有一个观点我非常赞同,那就是写程序的人,很重要。
写代码和很多艺术行为一样,具有不可复制性,发散性,不具有实体观察性等特点,并且评判标准不定,比如同样是画画,大师画一幅作品,灵感来了,一天可能就完工了,没有灵感时,一年也不一定画的出来。
可是写程序,就没有这么好的大众认知度了,如果你是一名自由职业的程序员,也许时间自由度上好一些,可以比较自由的写代码,有空余时间去思考如何优化你的代码和逻辑,但是如果很不幸,你就是一个普通的在职员工,每天被公司各种KPI考核,试问会有时间和精力去完美你的代码和逻辑吗?
这里就引申出更深一层的观点了。
那就是程序员的自我驱动力问题。
一个人具有了良好的内在驱动力,他不管在什么工作状态下,是公司打工,还是自由职业,都会抽出时间去内化自己的本领,会不断提升技术水平,对于解决问题的思路也会更发散,主动的去优化代码,从而在有限的时间内完成一个比较完美的代码作品。
可是现实很打脸,大部分程序员不会这么做,目前整个程序员行业鱼龙混杂,有的人就是冲着高薪和舒适的工作环境,才加入编程这个行业的。
有些人写的代码,惨不忍睹,不思进取(当然我不是想说自己有多优秀啊),公司上班时各种摸鱼,完成项目时东拼西凑,从来不考虑用户的使用体验感,在外加上很多外行管理者,瞎指挥,乱管理,最后的结果就是一个项目设计时,一个样子,完工时,另一个样子。
用户使用不舒服,维护人员也痛苦,永远是处于底层和前线的人,最受伤害。而那些高高在上的,远离开发的领导者们却光鲜靓丽,坐享其成,而后夸夸其谈,威名四方。
说回我的观点,人是一种变化多端的物种,其随意性很大,一个项目有100个人,就会有100个观点和想法,如果不能够用规范化的制度,和强有力的执行,是很难保证项目如期完工的。大到项目的整体设计,小到编码规范等,都是需要白纸黑字的明确出来,然后通过不断的规范改进,从而达到开发团队心往一处想,劲往一处使,开发出来的产品才是合格,好用的,才有可能成为精品。
软件开发和房地产开发相似程度最高,为什么地产开发就可以很规范,而软件开发就如此随意呢?也许是地产开发,是实体,是看得见摸得着的,从而经过多少年进化后,形成了一整套完备的模式。而代码编写,是虚拟的,是封装起来的,看不见摸不着,只能够从表象上去评判,所以就造成了编程语言众多、开发工具众多、框架众多、产品众多,总之一句话,就是乱。
语言分支多了,程序员掌握就需要很多时间,成本高;企业开发选择多了,内部沟通也就多了,简单问题就变成复杂问题,成本也高;所以软件开发还是很难。
test5-1
webform1.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="test5_1.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<div>候选国家: 你喜欢的国家:</div>
<asp:ListBox ID="lbxSource" runat="server" Width="94px" Height="150px" SelectionMode="Multiple">
<asp:ListItem Value="1">中国</asp:ListItem>
<asp:ListItem Value="2">美国</asp:ListItem>
<asp:ListItem Value="3">挪威</asp:ListItem>
<asp:ListItem Value="4">荷兰</asp:ListItem>
<asp:ListItem Value="5">瑞士</asp:ListItem>
<asp:ListItem Value="6">德国</asp:ListItem>
<asp:ListItem Value="7">英国</asp:ListItem>
</asp:ListBox>
<asp:Button ID="btn_select" runat="server" Text="加入" style="position:relative;top:-70px;left2px;" OnClick="btn_select_Click"/>
<asp:ListBox ID="lbxDestnition" runat="server" Height="150px" Width="90px" SelectionMode="Multiple"></asp:ListBox>
</div>
</form>
</body>
</html>
webform1.aspx.cs
using System;
usingSystem.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace test5_1
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btn_select_Click(object sender, EventArgs e)
{
int count = lbxSource.Items.Count;
int index = 0;
for (int i = 0; i < count; i++)
{
ListItem item = lbxSource.Items[index];
if (lbxSource.Items[index].Selected == true)
{
lbxDestnition.Items.Add(item);
}
index++;
}
//这段代码有缺陷,框1选中的国家,加入框2时,没有做重复项判断,所以会重复添加内容。
}
}
}
test5-2
webform1.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="test5_2.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="密码提示问题:"></asp:Label>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" Width="240px">
<asp:ListItem Value="0">请任选一项</asp:ListItem>
<asp:ListItem Value="1">我的出生地</asp:ListItem>
<asp:ListItem Value="2">我母亲的名字</asp:ListItem>
<asp:ListItem Value="3">我父亲的名字</asp:ListItem>
</asp:DropDownList>
<br />
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server" Width="99px"></asp:TextBox>
</div>
</form>
</body>
</html>
webform1.aspx.cs
using Syste;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace test5_2
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Label2.Text = "答案:";
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
switch (DropDownList1.SelectedValue)
{
case "1":
Label2.Text = DropDownList1.Items[DropDownList1.SelectedIndex].Text+":";
break;
case "2":
Label2.Text = DropDownList1.Items[DropDownList1.SelectedIndex].Text + ":";
break;
case "3":
Label2.Text = DropDownList1.Items[DropDownList1.SelectedIndex].Text + ":";
break;
}
}
}
}