程序员的基础和解决问题的思维很重要
为什么今天突然想说这个话题,那是因为在工作当中,被队友坑过。同样的一个功能,你让不同的人去实现,可能会有不同的实现方式,同样,就会得到不一样的结果。有些人做出来性能好,代码精简,可读性好,易于维护等,有些人写的代码不独代码凌乱堪,更能让服务器崩溃。程序员的基础和思维很重要,解决问题的思维,要多思考,而不能只考虑完成功能,其它就啥都不管了,说得严重点,给人条活路好么?人都是爹妈生的!
备注:本文采用C#编程语言
1、我先列一个最最简单的基础编程题,本来很简单,至于为什么写成了这样,不要问我,问写的那位大神吧,我完全相信我现在的公司中有人看到这样的代码(虽然工作几年了...)会给我一个错误的答案
int a = 5;
int b = a++ + (++a) * 2 + ++a;
Console.WriteLine(a);
Console.WriteLine(b);
解:5+ a=a+1 a=a+1 a=7 a=a+1=5 +7*2+8;
注意优先顺序,从左至右,一元运算符高于二元运算符
答案是:
8
27
一眼看上去,精简是精简了,可是可读性呢?这是给人看的么?如果你口算不出来,请复习下这一块的基础知识,补一补。
算运运算符 ++ --
++;分为前++和后++,不管是前++还是后++,最终的结果都是这个变量的值自身加1.
区别:如果在一个表达式中遇到了++运算符,
如果是前++,则首先这个变量的值自身加一,然后拿着这个加一后的值去参与运算。
如果是后++,则首先拿原值参与运算,运算完成后,自身再加一。
这里只是举个例子,现实中看到了类似的代码,我呢个去,我费了好大劲........
我用reflector工具查看了下,解析如下:
计算机会理解成如下:
int num = 5;
int num2 = (num++ + (++num * 2)) + ++num;
也就是说:
++在后,也就是说num依旧为5,等+运算后再执行++
num=num+1;//6
num=num+1; //7
两次++,num=7
5+7*2
num=num+1;//8
num2=5+7*2+8
IL语言如下:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 3
.locals init (
[0] int32 num,
[1] int32 num2)
L_0000: nop
L_0001: ldc.i4.5
L_0002: stloc.0
L_0003: ldloc.0
L_0004: dup
L_0005: ldc.i4.1
L_0006: add
L_0007: stloc.0
L_0008: ldloc.0
L_0009: ldc.i4.1
L_000a: add
L_000b: dup
L_000c: stloc.0
L_000d: ldc.i4.2
L_000e: mul
L_000f: add
L_0010: ldloc.0
L_0011: ldc.i4.1
L_0012: add
L_0013: dup
L_0014: stloc.0
L_0015: add
L_0016: stloc.1
L_0017: ldloc.0
L_0018: call void [mscorlib]System.Console::WriteLine(int32)
L_001d: nop
L_001e: ldloc.1
L_001f: call void [mscorlib]System.Console::WriteLine(int32)
L_0024: nop
L_0025: ret
}
IL语言看得够明了了吧!这是要考验我的理解能力和基础能力还是要显示得你牛逼呢?所以啊,还是要自我修炼,才能无论别人怎么坑我,我都能有办法应付哇
2、举例,控制台输入一个成绩,如果 成绩>=90 :输出A,如果90>成绩>=80 输出B,如果80>成绩>=70 输出C ,如果70>成绩>=60 输出D,如果 成绩<60输出E
(考虑用if好还是用if-else好还是if else if好,思考,为什么好?)
以下是我在项目中看见的三种写法:
代码如下:
Console.WriteLine("请输入你的考试成绩");
int score = Convert.ToInt32(Console.ReadLine());
if else 的做法
#region if -else的做法
if (score >= 90)
{
Console.WriteLine("A");
}
else//<90
{
if (score >= 80)
{
Console.WriteLine("B");
}
else//<80
{
if (score >= 70)
{
Console.WriteLine("C");
}
else//<70
{
if (score >= 60)
{
Console.WriteLine("D");
}
else
{
Console.WriteLine("E");
}
}
}
}
#endregion
if的做法
#region if的做法
if (score >= 90)
{
Console.WriteLine("A");
}
if (score >= 80)
{
Console.WriteLine("B");
}
if (score >= 70)
{
Console.WriteLine("C");
}
if (score >= 60)
{
Console.WriteLine("D");
}
if (score < 60)
{
Console.WriteLine("E");
}
#endregion
if else if的做法
#region if else if的做法
if (score >= 90)
{
Console.WriteLine("A");
}
else if (score >= 80)
{
Console.WriteLine("B");
}
else if (score >= 70)
{
Console.WriteLine("C");
}
else if (score >= 60)
{
Console.WriteLine("D");
}
#endregion
请比对下这三种实现方式有什么不同,哪一种好,为什么?发现什么问题了么?我在工作中,经常会看到一些程序员乱用if else,明明可以有更好的实现方式。
分支结构:if结构 if-else结构
选择结构:if else-if
swich case的做法(这里只考虑100分制)
public static string GetLevel(int score)
{
string level = "";
switch (score / 10)
{
case 10:
case 9: level = "A";
break;
case 8: level = "B";
break;
case 7: level = "C";
break;
case 6: level = "D";
break;
default: level = "E";
break;
}
return level;
}
3、使用一个同步程序或者定时任务计划来往Ftp服务器上面拋送订单报文,然后获取Ftp服务器上面的回执报文
公司程序是这样写的:
1、从数据库中查询需要拋送的订单
2、在服务器上面生成订单报文并存在一个文件夹下面
3、然后使用Ftp上传这些订单报文,已经上传成功的就修改这个报文名称(后面+_1)
4、上传完报文后,然后根据这些报文名称就去Ftp服务器上面下载回执报文,又存到一个文件夹里面
5、再读取这个文件夹里面的回执文件,已经读取过的,就把回执文件改名
......
我真心说不下去了,第一次看到的时候,我就觉得写这代码的人应该抓去牢房里关着,不要放出来
结果程序跑了一个月,服务器奔溃了,我上服务器上面删报文文件删除了2个小时,几十个G,然后看下程序代码,一千万匹草泥马奔腾而过,然后安排人重写代码...
我到现在都想不明白,程序为什么要这样写?即便你要生成订单报文,你按年、月、日生成报文文件,处理完成之后,把报文文件移动到特定目录下面,总比你改名快吧,然后定期把一个月前的交易记录删除(不要就直接删除)或者压缩包(要的话就压缩备份),怎么就不想一下一个月,这个文件夹下面会有几十万个文件呢,这是典型要干死服务器的节奏啊。至于根据文件名去下载Ftp上面的回执文件,也不需要再从这个文件夹里面遍历出所有_1的文件名,再去下载,这多慢啊,何不记录在redis里面或者memory存储类型的mysql数据表中呢?还有生成交易报文,上传交易报文,取交易报文回执都是在同一个线程里面的,为什么不使用多个人定时任务计划,多个进程呢?我一直想不明白.........
不过海关的技术人人员也真是奇葩,订单报文居然用XML,还一条记录一个XML文件,也不让压缩上传再解压,回执目录里面还存放几家企业的回执报文.........只能说国企真心有钱,根本不用担心网络流量和我们这边抛单的性能,卡死我们这些傻不拉唧的电商企业,找一点存在感。
我以前在的一家公司是做城市一卡通的,现在深圳通啊XX通啊基本上都是那公司做的,很老了,但是做的程序很稳定,每天上传交易报文,一个客户端的报文是一天一个文件,里面的记录是16进制,压缩上传,再解压,分目录存储、分目录备份,为什么?不阔气啊,省钱啊,公交车的交易报文是用gprs无线传输的,如果按照海关这样搞,不被搞死?也用过Ftp传输,交易量那么大,没卡死过,很稳定,因为我发现他们解决交易报文的方式不错,而不是用了啥新技术啊什么的,现在的公司刚成立2年,一天几千单订单报文,居然把自己的Web服务器搞死了,哪里的移植?从网上copy了正确的代码但是用在了错误的解决问题的思维上面。海关报文弄XML,还一个文件一个,我呢个去,用FTP上传,那么多电商企业往你海关FTP服务器上面传,你还不让人家打包,作死了.....海关把自己服务器作死了,我们不能把自己的服务器也作死啊!
4、foreach或者for循环中,N次更新、插入、删除数据库操作
我很好奇,为什么在循环里面要进行一次数据库连接、然后执行数据库操作,然后关闭连接,为什么不把需要进行数据库操作的内容保存在一个集合里面,最后一次性去执行Sql操作,让循环里面只进行一次打开、执行、关闭操作呢?人家ORM框架里面都有了批处理操作....
我在项目中看见很多地方,批量导入,批量更新回执状态的时候,经常看见这样的C#代码,抓狂,想把写代码的人拉去吊着打...........
5、系统后台,是一个完整的界面,也就是说,无论你点击啥,整个界面刷新,对就是整个界面刷新,刷新还要每次从session里面读出html把菜单重新加载一遍,我第一次看到,眼睛就被刷瞎了.......然后左侧菜单栏,为了保持记录选中状态,然后各种js+cookies就出来了,几百行js穿插其中,我艹,当时想重构的心都没有,就想重写(可是谁给我时间?烂摊子一个...),还有那奇葩的资源角色权限管理,居然是半自动的,市面上面早就是全自动了,什么是半自动,就是后台界面配置了,代码里面还要去修改,而且还是硬编码,我真的是长见识了,随便从网上乱下载一个源码也不至于这样啊!至于为什么能做出这样的项目,我不想说话。最后客户终于忍受不了,要求改,我就安排一个同事改了,用最简单的方式弄个frameset,然后把那几百行户js删除,终于只刷新中间部分了,唉!记得当时美工给我的(我当时做财务系统和给这个项目开发者的是同一个界面,可做出来后就是天壤之别了....
省略一万字,这些都是最最基本的东西,为什么一些工作几年了的程序员会犯这样的错误,估计是懒得思考吧,程序员是要学会偷懒,但是要勤于思考.....
提示:细心的朋友,会发现本文if的实现方式有bug,少了return,项目中就有人是这样干的......
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
最近我发现一个绝招,用DeepSeek AI处理Excel数据简直太爽了!处理速度嘎嘎快! 平常一整天的表格处理工作,现在只要三步就能搞 ...
2025-04-01你是否被统计学复杂的理论和晦涩的公式劝退过?别担心,“山有木兮:统计学极简入门(Python)” 将为你一一化解这些难题。课程 ...
2025-03-31在电商、零售、甚至内容付费业务中,你真的了解你的客户吗? 有些客户下了一两次单就消失了,有些人每个月都回购,有些人曾经是 ...
2025-03-31在数字化浪潮中,数据驱动决策已成为企业发展的核心竞争力,数据分析人才的需求持续飙升。世界经济论坛发布的《未来就业报告》, ...
2025-03-28你有没有遇到过这样的情况?流量进来了,转化率却不高,辛辛苦苦拉来的用户,最后大部分都悄无声息地离开了,这时候漏斗分析就非 ...
2025-03-27TensorFlow Datasets(TFDS)是一个用于下载、管理和预处理机器学习数据集的库。它提供了易于使用的API,允许用户从现有集合中 ...
2025-03-26"不谋全局者,不足谋一域。"在数据驱动的商业时代,战略级数据分析能力已成为职场核心竞争力。《CDA二级教材:商业策略数据分析 ...
2025-03-26当你在某宝刷到【猜你喜欢】时,当抖音精准推来你的梦中情猫时,当美团外卖弹窗刚好是你想吃的火锅店…… 恭喜你,你正在被用户 ...
2025-03-26当面试官问起随机森林时,他到底在考察什么? ""请解释随机森林的原理""——这是数据分析岗位面试中的经典问题。但你可能不知道 ...
2025-03-25在数字化浪潮席卷的当下,数据俨然成为企业的命脉,贯穿于业务运作的各个环节。从线上到线下,从平台的交易数据,到门店的运营 ...
2025-03-25在互联网和移动应用领域,DAU(日活跃用户数)是一个耳熟能详的指标。无论是产品经理、运营,还是数据分析师,DAU都是衡量产品 ...
2025-03-24ABtest做的好,产品优化效果差不了!可见ABtest在评估优化策略的效果方面地位还是很高的,那么如何在业务中应用ABtest? 结合企业 ...
2025-03-21在企业数据分析中,指标体系是至关重要的工具。不仅帮助企业统一数据标准、提升数据质量,还能为业务决策提供有力支持。本文将围 ...
2025-03-20解锁数据分析师高薪密码,CDA 脱产就业班助你逆袭! 在数字化浪潮中,数据驱动决策已成为企业发展的核心竞争力,数据分析人才的 ...
2025-03-19在 MySQL 数据库中,查询一张表但是不包含某个字段可以通过以下两种方法实现:使用 SELECT 子句以明确指定想要的字段,或者使 ...
2025-03-17在当今数字化时代,数据成为企业发展的关键驱动力,而用户画像作为数据分析的重要成果,改变了企业理解用户、开展业务的方式。无 ...
2025-03-172025年是智能体(AI Agent)的元年,大模型和智能体的发展比较迅猛。感觉年初的deepseek刚火没多久,这几天Manus又成为媒体头条 ...
2025-03-14以下的文章内容来源于柯家媛老师的专栏,如果您想阅读专栏《小白必备的数据思维课》,点击下方链接 https://edu.cda.cn/goods/sh ...
2025-03-13以下的文章内容来源于刘静老师的专栏,如果您想阅读专栏《10大业务分析模型突破业务瓶颈》,点击下方链接 https://edu.cda.cn/go ...
2025-03-12以下的文章内容来源于柯家媛老师的专栏,如果您想阅读专栏《小白必备的数据思维课》,点击下方链接 https://edu.cda.cn/goods/sh ...
2025-03-11