1
tianzx 2016-11-26 22:02:37 +08:00 via Android 1
好好看算法🙄
|
2
boyhailong 2016-11-26 22:33:59 +08:00 1
java 后端?如果是后端,首先是操作系统,网络,数据结构这些基础, java 语法,如果是 web 开发,熟悉一些 web 框架吧。
|
3
neoblackcap 2016-11-26 22:36:24 +08:00 7
刚好提了一个招聘的问题,那我就站在后端的角度说说了,毕竟楼主你是 Java ,按道理应该也是想干后端的吧。
首先呢,一个应届生我们对他都是没什么来了就能干活的期望,我们只希望他来了之后能快速成长,然后再慢慢开干。同时切记用语言划分岗位,什么 C++程序员, Java 程序, PHP 程序员都是狗屁招聘。 一门语言要了解它的语法然后干增删改查的活需要很久吗? 2 天可以了吧。所以语言划分工作都是渣,专注一个自己熟悉的领域才是正道,喜欢编程语言的就去学编程语言,学什么范畴论,喜欢分布式就应该去读 google 的分布式老三篇。 以我们公司为例,我们招人要求后端基础扎实。 需要会什么?请参考《 CSAPP 》。 具体不外乎什么是系统调用,并发控制,锁,进程 /线程, IO 中的同步,异步,堵塞,非堵塞,最好的例子就是写一个可以支持并发连接数为 10 的 echo server 等你学完了这些你去学什么框架都会很快的了,框架的学习要点不在于用,在于明白作者的思想,为什么要这样设计,然后你就可以用框架解决很多问题,以及会知道哪些问题框架解决不了要自己上。 大三的还算早,我当年也是大三特意花时间去看《现代操作系统》感觉实在是获益良多,有时间多看机械工业出版社的大理石系列的书,你看完之后肯定会获益良多,之后你再花一个月时间写个 echo server 放在你自己的 github 上,我保证你肯定能有真正互联网企业愿意招你,完全可以忽视那些伪 IT 企业。 |
4
echo1937 2016-11-26 22:40:31 +08:00
|
5
gogohigh 2016-11-26 22:43:17 +08:00
apue,unp 这两本书加上一点 java se 基础就可以了
|
6
depress 2016-11-26 22:50:17 +08:00 via Android
说句实话吧,在帝都,能用 ssi 或 spring mvc 搭个博客的,会 Linux 部署的, 12k 的工作能找到,多线程、反射、 nio 还比较熟,会一种 nosql 或内存数据库的, 15k 能找到,实际上我身边拿 15k 的人自己也搭不出一个博客, spring 用的也马马虎虎。然而我觉得对于应届生而言,算法是最重要的。
|
7
q397064399 2016-11-27 06:14:25 +08:00
|
8
q397064399 2016-11-27 06:30:26 +08:00
Java 最重要的就是
反射 反射 反射 线程 线程 线程 重要的事情提三遍,只要你吃透了反射 线程,各种框架基本上就是手到擒来, 我以前不懂,吃了大亏,搞懂了反射 线程,你就可以去各种框架的源代码里面 大概摸一摸(不提倡细读代码) 对你学习框架的使用有很大的帮助 |
9
q397064399 2016-11-27 06:32:28 +08:00
另外学框架 最好找个培训班录好的视频看, JavaEE 历史太悠久,有很多暗坑,自己踩起来 特辛苦
|
10
q397064399 2016-11-27 06:35:55 +08:00
@neoblackcap 这位仁兄要求并不高,本屌丝 菜鸟一枚 DNSProxy 初版代码,花了 2 天学习 Boost 的时间写的,
#include "stdafx.h" #include <iostream> #include <boost/asio.hpp> #include <vector> #include <boost/thread.hpp> #include <boost/date_time.hpp> #include <boost/lambda/bind.hpp> #include <boost/lambda/lambda.hpp> using namespace std; using namespace boost::asio; int thread_count = 0; boost::mutex mu; void handle_request(ip::udp::endpoint & request_ep, vector<unsigned char> &buff, int bytes, ip::udp::socket *back_socket) { mu.lock(); thread_count++; mu.unlock(); io_service dns; ip::udp::endpoint dns_server_ep(ip::address::from_string("223.5.5.5"), 53); ip::udp::socket sock(dns, ip::udp::endpoint(ip::udp::v4(), 0)); sock.send_to(buffer(buff, bytes), dns_server_ep); vector<unsigned char> data(2048, 0); int nativeSocket = sock.native(); fd_set fileDescriptorSet; struct timeval timeStruct; // set the timeout to 30 seconds timeStruct.tv_sec = 10; timeStruct.tv_usec = 0; FD_ZERO(&fileDescriptorSet); FD_SET(nativeSocket, &fileDescriptorSet); select(nativeSocket + 1, &fileDescriptorSet, NULL, NULL, &timeStruct); if (!FD_ISSET(nativeSocket, &fileDescriptorSet)) { // timeout std::string sMsg("TIMEOUT on read client data. Client IP: "); sMsg.append(sock.remote_endpoint().address().to_string()); cout << sMsg << endl; return; } int recv_bytes = sock.receive_from(buffer(data), dns_server_ep); back_socket->send_to(buffer(data, recv_bytes), request_ep); sock.close(); mu.lock(); thread_count--; mu.unlock(); cout << "alive thread is :" + to_string(thread_count) << endl; } void handle_connections() { io_service service; ip::udp::socket sock(service, ip::udp::endpoint(ip::udp::v4(), 53)); while (true) { ip::udp::endpoint sender_ep; vector<unsigned char> buff(1024, 0); int bytes = sock.receive_from(buffer(buff), sender_ep); boost::thread m_thread(boost::bind(handle_request, sender_ep, buff, bytes, &sock)); m_thread.detach(); } } int main(int argc, char* argv[]) { handle_connections(); } |
11
zjbztianya 2016-11-27 11:39:55 +08:00
@neoblackcap 公司要人么,感觉我很符合啊。。。 233333...知识点全是《 UNP 》和《 APUE 》的吧....最近刚好看了一遍。。。
|
12
neoblackcap 2016-11-27 11:51:39 +08:00
@q397064399
@zjbztianya 我司在广州天河,若是感兴趣的话,欢迎联系本人 echo server 纯手写并发 10 对于会的人来说当然不难,但是其中要掌握 socket 编程,系统的 IO 复用机制(select, poll, epoll)或者是 thread/process ,还有理解了同步,非同步,堵塞,非堵塞。这些很多人都已经不知道在说什么了。 |
13
zjbztianya 2016-11-27 12:01:35 +08:00
@neoblackcap 怎么联系呢
|
14
aias 2016-11-27 12:04:46 +08:00 1
简单来说可以从计算基础、 Java 语言和生产用的框架来点技能。一般像样点的单位比较看重你的基础,不像样的上来就问框架。
|
15
neoblackcap 2016-11-27 12:06:58 +08:00
@zjbztianya 我的私人邮箱地址为 “ neo.blackcap 在 gmail.com ” 发送简历以及要面试什么什么岗位即可
我司现招聘前端工程师,后端工程师( Java, Python)。后端嘛其实什么都搞,我们最近是在搞 PaaS 平台,欢迎各位有兴趣的联系我。同时请注明你是否面试实习的岗位,毕竟薪酬不一样要求不一样。 |
16
zjbztianya 2016-11-27 12:15:17 +08:00
@neoblackcap 好的
|
17
fantastM 2016-11-27 13:22:42 +08:00 1
java 基础最重要,框架仅是其次。算法、操作系统、网络是加分项
|
18
q397064399 2016-11-27 14:21:05 +08:00
@neoblackcap 好的,尝试下
|
19
Allianzcortex 2016-11-27 21:38:10 +08:00
@neoblackcap 我也看过原版的《 CSAPP 》,我保留一下疑问哈。后端开发和服务端开发是两个概念,做后端的话实际上对 epoll/select 是不需要了解的,阻塞 /非阻塞 /同步 /异步属于概念上了解,可以选择就好(比如我熟悉 Python,那么需要知道 twisted/gevent )。还有 @q397064399 我不了解反射⊙﹏⊙b 汗,多线程也就是限于处理实时流的时候用 implements runnable 来多线程去发个邮件,但最近写 Java 也写的很开心。如果像我一样对 Java 的要求是用的话,掌握 Design Pattern 基本就够了。
|
20
ihuotui 2016-11-27 21:50:17 +08:00 1
整洁代码之道 设计模式 单元测试 java
|
21
q397064399 2016-11-27 22:52:23 +08:00
@Allianzcortex
后端开发确实对 同步 IO/异步 IO 以及阻塞模型 做概念上的了解即可(因为通常 指的都是 HTTP 服务器后端业务开发), 跟服务端开发确实不是一个概念,因为绝大部分后端开发都是在成熟的框架下完成业务的编码 拿 J2EE 来讲, Servlet3.0 规范之前是没有异步的 IO ,都是阻塞,然后每一个 HTTP 请求对应一个 ServletRequest ,如果 Servlet 不返回信息,浏览器就会一直被阻塞,直到超时,而后端每一个请求对应一个线程 这样也可以简化开发,另外针对 HTTP 的无状态的特性,大大降低了程序员的心智负担,仅需要在数据库操作的 Service 层做事务跟并发同步 即可,其余的业务层 视图层都是针对单用户编写代码 Java 的反射并不是多难,理解反射的概念 有助于理解框架,要想程序逻辑清晰,得面向切面编程吧,把事务控制 日志记录 全向访问都通过 切面隔离开来,这样主线逻辑代码就会更清晰,这里就会用到 AOP 对象的管理,不能总 new 来 new 去,肯定要交给对象容器来管理,现在连 Android 都开始流行 依赖注入跟 AOP 了 直接用 @注解 +反射 而 AOP 以及依赖注入提出来比较晚,所以没有上 Gof 设计模式那本书,你看过 Head First 设计模式就知道 Java 结合反射 动态代理来实现对象的装饰 以前写 Android 是这样一个尿性 public xxxActivity extends Activity { @Override protected onCreate(){ xxxx; xxxx; findByView(); findByView(); findByView(); } xxx = xxxObj.setOnClickListen(new onClickListen(){ }) } 现在呢? 直接注解,完事,然后交给框架去反射 装配我们的代码 @Activity(label = "@string/app_name") @Layout(R.layout.main) public class HelloTransfuse { @Inject @View(R.id.textview) TextView textView; @Inject @Resource(R.string.hello) String helloText; @OnCreate public void hello() { textView.setText(helloText); } } |
22
neoblackcap 2016-11-28 09:22:51 +08:00
@q397064399
@Allianzcortex 哦你们这样划分的啊,我还一直以为后端是 backend ,也就是不跟用户交互的都是后端。不过在学习同步,异步,堵塞,非堵塞这个时候不接触到 epoll/select 这些 API 应该是比较难的吧, CSAPP 我是没看完, UNP 里面倒是会提到 select,这些 IO 复用机制必然是会提到啊。 Java 对整体封装得比较好,但是了解一下底层的东西肯定是有加分的。毕竟公司又不是一直用 Java 。 |
23
q397064399 2016-11-28 09:51:14 +08:00
@neoblackcap 不用 Java 难道拍簧片?
|
24
q397064399 2016-11-28 09:59:09 +08:00
@neoblackcap
除开游戏行业以及嵌入式行业有特殊需求外( Java 需要在 mina netty 等 tcp 网络框架下自己玩之外 C++ C# 也有 tcp 网络框架) 目前绝大部分应用开发 无论是企业应用还是商业软件 基本上都是 http 为主流了吧, 移动 APP 基本上是 http ,自己写一套后台应用协议 估计还没上架 APP 公司就关门了 |
25
ihuotui 2016-11-28 10:39:25 +08:00
@neoblackcap 等你到了要别的语言再说吧, java 都没有学好,没有机会做别的。
|
26
neoblackcap 2016-11-28 10:56:40 +08:00 1
|
27
neoblackcap 2016-11-28 10:59:33 +08:00
@q397064399
我们真的有用其他协议的,比如 mqtt,rtmp ,都是要基于这些东西搞研发的。还有 rpc 都是要考虑协议的,当然 rpc 就都是用其他库的了,不过我可以肯定我们用的不止 http |
30
teemoer 2016-11-29 00:58:55 +08:00
|
31
romennts 2016-12-13 19:35:26 +08:00 via Android
这是我看过 V2EX 回复最厉害,最赞同的一次。以至于我不得不冒泡一下
|
32
yxx278yxx 2016-12-15 18:35:27 +08:00
可以的,展望 10k 的感觉要努力了
|