沈阳东软实训记

听说小学期要去沈阳东软实训,然而做的并不是什么高大上的项目……没什么期待也没反感,就这样去了沈阳。去的路上印象比较深刻的就是半夜肩膀疼被疼醒,发现是被空调直接吹到-_-||睡上铺真是苦逼啊……到了之后感觉实训的地方竟然有点像blue fly……虽然看起来很高大上

第一天上午听完一个老师瞎白话和裴壕对老师的无情嘲讽之后,下午到教室分组,装Ubuntu虚拟机……分组可以自己挑好评,同组有Green God, Small God还有Niang God以及一个妹子。教室的机器是Thinkpad T400/T61,放现在看真是“又不是不能用”的机器……2G内存的机器强行上Ubuntu虚拟机也是醉了。(这些天感觉渣机对效率影响比较大,很多工作其实都是回寝室用自己电脑完成的。以后知乎上看见“编程用什么电脑好”之类的问题下面有“勉强能用的电脑就够了”这样的答案一律反对+没有帮助……)

要做的东西是一个Linux下的即时通讯软件(其实就是可以实现最基本功能的聊天软件),用socket进行网络通信,gtk+-2.0写图形界面,编程语言是C/C++。老师先科普了Linux下写代码的正确姿势,以及多线程,socket编程的姿势。(最后的项目里,网络通信的代码差不多都是抄的老师给的示例里的代码……虽然能写出来但还是不完全明白是怎么回事。一定要好好学计网……)最后仓促地科普了一下GTK,给了一些参考资料。大概三天的样子,被填鸭了这些东西……然后就要开始写代码了QAQ

一开始的分工是Green God和Niang God分别写服务器/客户端,本菜和Small God写GUI部分。想用JSON字符串在客户端和服务器之间传递消息,于是搞来了cJSON库,然而队友们并不怎么会用……只好再封装一下这个库,变成项目里可以直接用的东西。这样过了两天发现Green God和Niang God这样写+本菜东拼西凑的服务器和客户端可能不太稳定,于是强行包揽了服务器和客户端的活,然后把GUI部分扔给其他人。于是又愉快地搞来了SQLite3数据库……就这样愉快地写了几天,围观其他组发现貌似进度好快的样子……

还剩两天的时候GUI部分终于写完了,测试了下服务器和客户端貌似没发现很严重的问题……于是就开始合体了。没想到最大的问题就出在这……我写的代码稀烂,队友的GUI看起来屌得飞起但是几乎没法用……因为几乎完全没有暴露出调用的接口。逼着队友改,结过除了函数还搞出一大坨全局变量……还好改完没出新的问题。然后就出现了意想不到的bug,服务端收消息的循环竟然会卡住!而且还是卡在循环体最后一条语句和第一条语句之间……当时心里一万头精心饲养的草泥马呼啸而过,这都什么bug……甚至一度怀疑是Runtime出了问题……一度怀疑人生……这要真是服务器的bug,我的锅就甩不掉了……然而之前的命令行版本完全没有这个问题。于是用专治各种不服的printf调试大法,发现客户端保存的连接到服务器的socket文件描述符出了问题,执行完一次就变成0了。然后客户端在执行send函数的时候出了问题,导致服务端看上去“卡住”了……最后发现是之前应该删的一句代码没有删掉,导致内存越界。于是这个值就奇怪地变成0了……搞定这个bug之后瞬间通畅。(关于这个bug:最早的版本里客户端和服务端发送的包大小都是JSON字符串的长度,客户端接收消息之后会把字符串后面的一个位置置为0。但是发现这样传输会有粘包/半包问题,于是改成发送固定大小的包,并且包的大小为客户端buffer的大小。置0语句没有删掉,最后导致内存越界访问。这么弱智的错误……不要问我为什么命令行界面下没有出这个问题,对C语言程序的内存分配一窍不通……)最后一天下午极限时间debug完,交了程序……坐等最后压力测试。

压力测试的时候发现了程序一个严重的缺陷,消息的时间都是按客户端的系统时间确定的。运行客户端的机器系统时间不一样,最后看到的消息就都是乱的(因为消息按时间排序)……只想让服务器的架构简单一点,只负责转发消息不负责更改消息,结果忽略了这样的问题。还是图样图森破。当时想着,客户端的网络通信+数据库部分和GUI合起来写成那个样子,爱跪就跪吧……只要服务端不跪就好。结果只有本菜这组的服务端没跪……我们可能也是唯一用了数据库以及第三方库的。全部代码都自己写说不定跪得更惨……

最后效果虽然可以,然而代码写得稀烂。终于知道“但是用Java的都是傻逼”这句话好像有点道理……如果用Java只写一点完成普通任务的程序,智商会被拉低不少……这次换到C之后被各种内存泄漏和访问空指针以及乱七八糟的参数类型坑得比较惨。离真正的应用还有很远……程序的架构和编码风格一直图样图森破,还是要多撸代码多膜拜大牛啊。debug的时候一定要冷静,大不了就重新写一遍(这样虽然能以比较大的概率避免原来的问题,但是不知道原来的问题出现的原因了,也是比较无奈。实际上最后客户端与GUI合体的时候几乎就重写了客户端……)机器不违背物理规律的话是没有错的,最大的bug其实是人自己。


项目源代码:https://github.com/entalent/SkyQ/tree/master

//嗯,这个账户下还有其他写得不忍直视的项目……欢迎吐槽

------------------------------------------------------大二结束的碎碎念------------------------------------------------------

回帝都的火车上,上学期的成绩竟然全出来了……貌似又呵呵了。曾经想了很长时间,然而什么都没有想明白。也想过和某某一起,但最后发现自己太黯淡,配不上别人的耀眼。不知道什么时候开始,变得这么斤斤计较。特意和小伙伴一起买了回帝都的车票,结果是自己一个人先倒在卧铺上睡着。人生有太多变数,但总要有些东西是不变的才行。


…………

你可能感兴趣的:(打酱油)