那些一心想要离开 BAT 的人,后来怎么样了?

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://csdnnews.blog.csdn.net/article/details/78315184

围在城里的人想逃出来,城外的人想冲进去,对婚姻也罢,职业也罢,人生的愿望大都如此。 ——《围城》

究其我们的一生,每日穿梭于熙熙攘攘的人群之中,只为遇见一个更好的自己,正如「人心是个无底洞,填不满也掏不空」。身在竞争激烈的“职场围城”之中,对于没得到的,总会幻想其他地方一定存在,于是我们开始在各个围城中奔走寻找。

气派的办公大楼、高配的开发机、令人羡慕的福利待遇、巨大的成长空间………..带有 BAT 光环的职场似乎是大家坚持奋斗的目标,而当真正进入这座围城之中,事实真的如此吗?

几天前,一篇题为“Working at Google seemed like a dream job. The reality has been a tedious, pointless nightmare.”的文章,让人如饮醍醐。

当我是 300 万求职者中的一员时,Google 职业门户网站上的标语引起了我的注意——“Do Cool Things That Matter”,它一下子简明扼要地说明了科技行业的休闲时尚和激情。

虽然过去两年中,身处人力资源部门的我也完成了 Google 阐明的一些工作内容,但是我似乎始终无法获得我的个人成长经验,于是本周我决定辞职。

作为一名“人才猎头”,我的工作没有什么了不起的,具体的工作内容就是向那些没有申请或可能需要说服的技术大牛们征求加入我们团队的机会。我搜索了 LinkedIn,为工程师们提供了一套特定的技能,然后每周向不知情的技术大牛发送数百条信息。

Google HR 使用特定的程序,填写固定的电子邮件模板并发送,然后会和感兴趣的候选者进行 10 分钟的电话交谈,主要也是基于常规的问题和推荐 Google 的工作,如此日复一日,年复一年。

而近日的一篇《工作三年后,我选择离开腾讯》文章,再次加深了我们的反思:

“你居然要从腾讯离职了!?”

这是身边朋友得知我要离开后的反应,似乎大家都难以理解这样的决定。

从行业环境来看,中国互联网正处于一派繁荣之境;从公司形势来看,也正要准备大刀阔斧地干一番大事业;从个人发展来看,自己在公司也会担任越来越重要的角色。

所有的环境都是好的,更加显得离职的决策不理智。

HR 系统弹窗给出最后的挽留:你确定要提交离职申请吗?

经过各种综合考虑后,我还是点了“确定”按钮,正式从工作了三年的腾讯离职。

事实上,抛开光鲜的外表,大公司的诟病一直存在:制度流程一体化、每天开不完的会议、改不完的需求……

反观身处全栈工程师满地的小公司,即使是一名 Leader,万事也要亲力亲为,因为事多、人少、缺乏经验,但是由此也可以得到全方位的锻炼与发展。

当身处好与坏的围城之中,“城里的人想逃出去,可逃出去又怎样呢?一片荒郊;城外的人想冲进来,可冲进来又怎样呢?一片废墟。”

如果是你,是会想选择进入大公司的城内还是出去看看外面的世界?而一心想要离开 BAT 的你们,追寻到更好的自己了吗?现在如何了?欢迎在下方留言区,分享围城之中的苦与乐。

展开阅读全文

送给那些一心想要传送文件的朋友(TCP协议),写的不太好,分也不太多.

11-12

[code=C/C++]rnrn//以下是测试结构rntypedef struct tagRequestrnrn UINT nMagic;rn UINT ncbSize;rn //rn // 这中间可以写点别的rn //rn //rn //数据长度rn UINT nContentLength;rn rnREQUEST,*PREQUEST,*LPREQUEST;rnrn#define REQUEST_MAGIC 0x12345678 rn#define REQUEST_SIZE (sizeof(tagRequest))rnrntypedef struct tagResponsernrn UINT nMagic;rn UINT ncbSize;rn //rn // 这中间可以写点别的rn //rn //rn //数据长度rn UINT nContentLength;rnRESPONSE,*PRESPONSE,*LPRESPONSE;rnrn#define RESPONSE_MAGIC 0x87654321rn#define RESPONSE_SIZE (sizeof(tagResponse))rnrnrnvoid PopErrorMessage(DWORD dwErrorCode)rnrn LPVOID lpMsgBuf = NULL;rn if( ::FormatMessage( rn FORMAT_MESSAGE_ALLOCATE_BUFFER | //这个是要自动分配一块内存,使用完要通过LocalFree来回收rn FORMAT_MESSAGE_FROM_SYSTEM | rn FORMAT_MESSAGE_IGNORE_INSERTS,rn NULL,rn dwErrorCode,//这里是要翻译的代码rn MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 默认提示语言(也可以随便指定一种)rn (LPTSTR) &lpMsgBuf,rn 0,rn NULL rn ) >0 )rn rn // 弹一个对话框出来.rn ::MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );rn // 这里释放掉返回的内存......................rn ::LocalFree( lpMsgBuf );rn rnrnrnrn//发送数据rnint SendHunk(SOCKET h,char *lpBuf,int nBufLen)rnrn int nSend = -1 ;rn int nSendAll = 0;rn rn if( h != SOCKET_ERROR && lpBuf != NULL && nBufLen > 0 )rn rn //循环发送,直到所有数据都发送完毕或出错就返回rn do rn rn nSend = ::send(h, //已经连接的句柄rn lpBuf+nSendAll, //跳过已经发送的数据rn nBufLen-nSendAll, //计算剩余要发送的数据长度rn 0);rn rn if( nSend > 0 )rn nSendAll +=nSend;//累加已经成功发送的数据长度rn elsern break;rn rn while( nSendAll < nBufLen );rn rn rn return nSendAll;rnrnrn//接收数据rnint RecvHunk(SOCKET h,char *lpBuf,int nBufLen,int nWillLen)rnrn int nRecv = -1 ;rn int nRecvAll = 0;rnrn if( h != SOCKET_ERROR && lpBuf != NULL && nBufLen > 0 && nWillLen >0 && nBufLen >= nWillLen )rn rn //循环接收,直到数据达到要接收的长度或出错就返回rn do rnrn nRecv = ::recv(h, //已经连接的句柄rn lpBuf+nRecvAll,//跳过已经接收的数据rn nWillLen-nRecvAll,//计算剩余要接收的数据长度rn 0);rn if( nRecv >0 )rn nRecvAll = nRecv;//当前已经接收的长度rn elsern break;rn rn while( nRecvAll < nWillLen );rn rnrn return nRecvAll;rnrnrnvoid Client()rnrn //发送一个变长的数据块rn rn //rn //创建一个句柄(注:默认的情况下会返回一个阻塞句柄.) rn SOCKET hSocket = ::socket(AF_INET, // IPV4rn SOCK_STREAM, // 数据流 (像河水一样连绵不断,当然也有断流的时候.^-^) rn IPPROTO_TCP // TCP协议(一部分书上说填0,让协议自己选择)rn );rn rn if( hSocket == SOCKET_ERROR )rn rn //哇,出错了,//看看是什么错.rn DWORD dwErrorCode = ::WSAGetLastError();rn //怎么是数字啊!!看不懂,翻译一下.^-^rn PopErrorMessage(dwErrorCode);rn //没办法继续干活了,退出吧!rn return ;rn rn rn //定义一个结构用来保存要连接的远程地址和端口rn sockaddr_in stRemote = 0;rn rn stRemote.sin_family=AF_INET; //IPV4rn stRemote.sin_addr.s_addr = inet_addr("127.0.0.1"); //远程地址(这里用的本机回路地址)rn stRemote.sin_port=htons(12345);//一个端口(这里是随便写的)rn //连接远程主机 rn int nReConn = ::connect(hSocket,//前面创建的句柄rn (SOCKADDR*)&stRemote, //上面的结构(已经填好远程主机的地址和端口)rn sizeof(stRemote) //结构体长度 rn );rnrn if( nReConn == SOCKET_ERROR )rn rn //哇,出错了,//看看是什么错.rn DWORD dwErrorCode = ::WSAGetLastError();rn //怎么是数字啊!!看不懂,翻译一下.^-^rn PopErrorMessage(dwErrorCode);rn //关闭句柄,并初化为一个错误值rn ::closesocket(hSocket);rn hSocket = SOCKET_ERROR;rn //没办法继续干活了,退出吧!rn return ;rn rnrnrn char * szText[] = "小鸟,小鸟,我是鸟巢,收到请回答!",rn "老鸟,老鸟,我是小鸟,收到请回答!",rn "呜呜,为什么没有回答呀?",rn "下雪了,该收衣服了!",rn "天冷了.";rnrn //随机选一个字符串发过去rn char * szRequestText = szText[rand()%(sizeof(szRequestText)/sizeof(szRequestText[0]))];rnrn tagRequest stReq = 0;rnrn stReq.nMagic = REQUEST_MAGIC; //结构体识别编码(随便什么都行,不一定要用数值)rn stReq.ncbSize = REQUEST_SIZE; //填上结构体大小,以识别目前能不能处理.rn //有可能结构体大小发生变化,这种情通常出现在产品的不同版本中,本例不考虑这种情况.rn stReq.nContentLength = ::lstrlen(szRequestText)+1;// 要发送变长数据体长度 (这里的加1,是要把末尾的结束符'\0'也发送过去)rnrn //这里用的是封装后的send 具体到上面看吧rn //发送请求头rn //返回是已经发送的数据长度rn int nSend = ::SendHunk(hSocket, //前面创建的句柄rn (char*)&stReq, // 请求结构体指针rn REQUEST_SIZE // 请示结构体长度rn );rnrnrn if( nSend != REQUEST_SIZE )rn rn //如果返回的长度不等于结构体长度,表示出错了.rnrn //哇,出错了,//看看是什么错.rn DWORD dwErrorCode = ::WSAGetLastError();rn //怎么是数字啊!!看不懂,翻译一下.^-^rn PopErrorMessage(dwErrorCode);rn //关闭句柄,并初化为一个错误值rn ::closesocket(hSocket);rn hSocket = SOCKET_ERROR;rn //没办法继续干活了,退出吧!rn return ;rn rn rn //发送完结体后,接着发送变长体数据rn nSend = ::SendHunk(hSocket, //前面创建的句柄rn szRequestText, // 变长数据rn stReq.nContentLength // 变长数据长度rn );rnrnrn if( nSend != stReq.nContentLength )rn rn //如果返回的长度不等于变长数据长度,表示出错了.rn rn //哇,出错了,//看看是什么错.rn DWORD dwErrorCode = ::WSAGetLastError();rn //怎么是数字啊!!看不懂,翻译一下.^-^rn PopErrorMessage(dwErrorCode);rn //关闭句柄,并初化为一个错误值rn ::closesocket(hSocket);rn hSocket = SOCKET_ERROR;rnrn //没办法继续干活了,退出吧!rn return ;rn rnrn //关闭句柄,并初化为一个错误值rn ::closesocket(hSocket);rn hSocket = SOCKET_ERROR;rnrnrnrnvoid OnAccept(SOCKET hClient)rnrn rn tagRequest stReq = 0;rn rn //接收数据rn //先接受请求头rn int nRecv = ::RecvHunk(hClient, //上面接收连接句柄rn (char*)&stReq, //接收缓冲区rn REQUEST_SIZE, //可用的缓冲区大小rn REQUEST_SIZE //将要接收的数据(这里填的请求头大小,也就是小于这个的将不与处理)rn );rn rn if( nRecv != REQUEST_SIZE )rn rn //哇,出错了,//看看是什么错.rn DWORD dwErrorCode = ::WSAGetLastError();rn //怎么是数字啊!!看不懂,翻译一下.^-^rn PopErrorMessage(dwErrorCode);rn //关闭连接句柄rn ::closesocket(hClient);rn hClient = SOCKET_ERROR;rn rn //没办法继续干活了,退出吧!rn return ;rn rn rn rn //验证结构是否合法rn if( stReq.nMagic != REQUEST_MAGIC || stReq.ncbSize != REQUEST_SIZE)rn rn //哇,非法数据,警告!!这不是我们自己人!!!rn rn //关闭连接句柄rn ::closesocket(hClient);rn hClient = SOCKET_ERROR;rn rn //没办法继续干活了,退出吧!rn return ;rn rn rn //在这里可以验证一下其它请求头参数(注:本例不验证).rn rn char * pszRequestText = new char[stReq.nContentLength];rn rn if( pszRequestText )rn rn //再接收变长数据rn int nRecv = ::RecvHunk(hClient, //上面接收连接句柄rn pszRequestText, //接收缓冲区rn stReq.nContentLength, //可用的缓冲区大小rn stReq.nContentLength //将要接收的数据大小rn );rn rn if( nRecv != stReq.nContentLength)rn rn //唉!数据呢?????rn rn //关闭连接句柄rn ::closesocket(hClient);rn hClient = SOCKET_ERROR;rn rn //回收上面申请的内存rn delete []pszRequestText;rn pszRequestText = NULL;rn rn //没办法继续干活了,退出吧!rn return ;rn rn rn rn //rn ::MessageBox(NULL,pszRequestText,"瞧瞧发来是什么",MB_OK | MB_ICONINFORMATION);rn rn //回收上面申请的内存rn delete []pszRequestText;rn pszRequestText = NULL;rn rn rn rn rn //关闭连接句柄rn ::closesocket(hClient);rn hClient = SOCKET_ERROR;rnrnrnDWORD WINAPI ThreadOnAccept(LPVOID lpData)rnrn OnAccept((SOCKET)lpData);rn rn return 0;rnrnrnrnvoid Server()rnrn //接收一个变长的数据块rn rn //rn //创建一个句柄(注:默认的情况下会返回一个阻塞句柄.) rn SOCKET hSocket = ::socket(AF_INET, // IPV4rn SOCK_STREAM, // 数据流 (像河水一样连绵不断,当然也有断流的时候.^-^) rn IPPROTO_TCP // TCP协议(一部分书上说填0,让协议自己选择)rn );rn rn if( hSocket == SOCKET_ERROR )rn rn //哇,出错了,//看看是什么错.rn DWORD dwErrorCode = ::WSAGetLastError();rn //怎么是数字啊!!看不懂,翻译一下.^-^rn PopErrorMessage(dwErrorCode);rn //没办法继续干活了,退出吧!rn return ;rn rn rn rn //定义一个结构用来保存本机地址和端口rn sockaddr_in stLocal = 0;rn rn stLocal.sin_family=AF_INET; //IPV4rn stLocal.sin_addr.s_addr = inet_addr("127.0.0.1"); //本机要使用IP地址(这里用的本机回路地址)rn stLocal.sin_port=htons(12345);//一个端口(这里是随便写的)rn rn int nReBind = ::bind(hSocket,//前面创建的句柄rn (SOCKADDR*)&stLocal, //上面的结构(已经填好远程主机的地址和端口)rn sizeof(stLocal) //结构体长度 rn );rn rn rn if( nReBind == SOCKET_ERROR )rn rn //哇,出错了,//看看是什么错.rn DWORD dwErrorCode = ::WSAGetLastError();rn //怎么是数字啊!!看不懂,翻译一下.^-^rn PopErrorMessage(dwErrorCode);rn //关闭句柄,并初化为一个错误值rn ::closesocket(hSocket);rn hSocket = SOCKET_ERROR;rn //没办法继续干活了,退出吧!rn return ;rn rn rn //设置监听数量rn int nRelisten = ::listen(hSocket,//前面创建的句柄rn SOMAXCONN //同时连接数,(注:这里的连接数,指的是同时可以接受的请求连接数.不是指可以连接到这个端口的数量)rn );rnrn if( nRelisten == SOCKET_ERROR )rn rn //哇,出错了,//看看是什么错.rn DWORD dwErrorCode = ::WSAGetLastError();rn //怎么是数字啊!!看不懂,翻译一下.^-^rn PopErrorMessage(dwErrorCode);rn //关闭句柄,并初化为一个错误值rn ::closesocket(hSocket);rn hSocket = SOCKET_ERROR;rn //没办法继续干活了,退出吧!rn return ;rn rn rn do rn //定义一个结构用来保存要连接的远程地址和端口rn sockaddr_in stRemote = 0;rn int nRemoteLen = sizeof(stRemote);rn //等待远程连接到的到来.(从理论上讲,只要资源足够,可以接受足够多个连接).rn //返回一个新的连接句柄rn SOCKET hSocketClient = ::accept(hSocket,//前面创建的句柄rn (SOCKADDR*)&stRemote, //保存已经连接远程主机地址rn &nRemoteLen //保存已经连接远程主机地址长度(注:这个值在传入时表示可用的缓冲区长度,传出时表示已经保存的地址长度)rn );rn rn if( hSocketClient == SOCKET_ERROR )rn rn //哇,出错了,//看看是什么错.rn DWORD dwErrorCode = ::WSAGetLastError();rn //怎么是数字啊!!看不懂,翻译一下.^-^rn PopErrorMessage(dwErrorCode);rn //关闭句柄,并初化为一个错误值rn ::closesocket(hSocket);rn hSocket = SOCKET_ERROR;rn //没办法继续干活了,退出吧!rn return ;rn rn rn rn HANDLE hThClient = ::CreateThread(NULL,0,ThreadOnAccept,rn (LPVOID)hSocketClient,//这个句柄会在线程内关闭rn 0,NULL);rnrn //关闭线句柄(注:线程不会退出的!!)rn ::CloseHandle(hThClient);rn hThClient = NULL;rn rn while(TRUE);rnrn return;rnrnrnrnrnDWORD WINAPI ThreadServer(LPVOID lpData)rnrn Server();rnrn return 0;rnrnrn[/code]rnrn各位将就着看吧,匆匆忙忙写的,还有很多问题. 论坛

没有更多推荐了,返回首页