国内招聘的好多职位,好多要求35岁以下。现实好残酷。


请先 登录 后评论

8 个回答

叶亚容

你说的是技术岗吧,管理岗肯定不是这样的。
30-40岁不到这个岁数你想跳cto岗还不容易呢。

请先 登录 后评论
封冠

没事看看大马的一把手
93了

请先 登录 后评论
贺勤

我见过要求30岁以下的
并不是admin一类的基础职位,是分公司的财务经理....

请先 登录 后评论
江妹

现实是
35岁以上找工作还需要盲投简历的话,人生就太失败了。35岁以上,找工作要靠人脉,要么自己是老板。

请先 登录 后评论
薛飞莲

问题是有的人不愿意做管理岗啊
只喜欢做技术。做管理的又不一定比做技术的挣得多,两条track而已。

另外管理岗的人普遍技术一般般,没有什么过硬的吃饭本领,这种人失业了往往更难找工作。

请先 登录 后评论
叶亚容

cto,technical director 也算是管理岗啊,也可以一样做技术啊。。
只是单纯的别人指导你,而你只是做最基础的工作(例如程序员函数别人都设计好了,你来写这种的),年纪越大是越难混了。哪个国家都一样,不单单是中国。


请先 登录 后评论
薛飞莲

你应该不是搞技术的
你说的那些cto director之类的职位明显是管理岗,而不是技术岗了。

我说的在technical track一路走下去的,并不是要管人,而是在某一个领域成为技术专家。比如java之父james gosling这种级别的大牛,都62岁了,到现在为止也就是亚马逊的一个distinguished engineer,并不需要去管人,但他在一个特定的技术领域是公司里广受尊敬的sme(subject matter expert),工资也并不比公司内部同级别的management track低,这就是在技术岗一路走下去的典型例子。

当然像你说得那种年纪很大,但技术能力一点儿都没长进,仍然只能在technical track上做一些初级工作的人,的确是在哪里都不太好找工作了。

请先 登录 后评论
叶亚容

那种高级技术专家,在国内会因为年龄找不到工作?
那种只要35的,是因为他只想招你过去当低级码农而已。。

我还真是搞技术的,今年37了。我写的代码,我相信本论坛能看懂的人都不多。例如,上周五刚写的。。

只是一个大的分布式存储数据结构中的mutex 。。基本没有版权问题,因为你拿来也没法用,是专门为特殊的结构写的。。

class shared_mutex {
struct lock {
// The top-most bit (exclusive) is an exclusive lock and only one thread
// is able to acquire the exclusive successfully. This bit indicates whether
// a thread successfully acquires the lock.
//
// Note that, once an exclusive lock is locked, it will never be unlocked unless
// the node is not modified due to some other errors.
//
// This is because it is non-sense to lock the same node to write twice: once
// a node is written to another copy, the old one will be put on readonly_list
// and will never be written again.
uint64_t exclusive : 1;
// Indciates the unique ID of this thread.
uint64_t id : 48;
// Number of threads that are going to write on the nodes beneath the current node.
uint64_t shared_count : 15;
};
std::atomic<lock> lock_ { {0, 0, 0} };

public:

// Try to acquire a shared lock (increase shared count by 1).
// The try lock shared can also be temporally blocked for a small time if
// someone else is also modifying the shared_count (either add or subtract)
// concurrently.
//
// It will only fail when someone else got the exclusive lock (i.e., will
// modify the current node).
//
// We do not provide block version of lock_shared because it's non-sense
// to wait for a writing thread (which may change current node as well as
// the parent nodes). We have to return false and release all the shared lock
// of parents path to allow the current writing thread to possibly proceed
// (to avoid dead lock).
bool try_lock_shared() noexcept {
// When there is already a write lock (meaning someone is waiting for
// write permission on the current node), return false (we don't allow
// any new thread to change on any node beneath the current node).
// They must wait for the current node to realese exlcusive_lock before
// continuing.
lock currentlock = lock_.load();
if (currentlock.exclusive == 1) {
return false;
}

// If failed, meaning that someone else modified the current lock.
// If someone else obtains exclusive lock, we just simply return fail.
// If someone else just changed shared count (add or subtract), we try agian.
// We assume that such shared count change can't be blocked forever.
lock newlock;
do {
newlock = currentlock;
newlock.shared_count++;
}
while(!lock_.compare_exchange_weak(currentlock, newlock) && currentlock.exclusive == 0);

// If return true, we can be sure that no one else got exclusive lock for writing yet.
return currentlock.exclusive == 0;
}


// Unlock a shared lock (decrease the count by 1).
// Will always return true. May be blocked for a small time.
void unlock_shared() noexcept {
lock currentlock = lock_.load();

lock newlock;
do {
newlock = currentlock;
newlock.shared_count--;
}
while(!lock_.compare_exchange_weak(currentlock, newlock));
}


// Check whether shared lock is 0
bool check_all_shared_unlocked() noexcept {
lock currentlock = lock_.load();
// The thread who calls this, must be the thread that
// obtains the exlcusive lock.
assert(currentlock.id == utils::get_thread_id());
return currentlock.shared_count == 0;
}

// Wait for shared lock to be 0 for a specified duration.
bool wait_all_shared_unlocked_for(const std::chrono::nanoseconds &duration) noexcept {
return wait_all_shared_unlocked_until(std::chrono::high_resolution_clock::now() + duration);
}

// Wait for shared lock to be 0 until the given time.
bool wait_all_shared_unlocked_until(const std::chrono::high_resolution_clock::time_point &expire) noexcept {
bool result = false;
while( std::chrono::high_resolution_clock::now() < expire && !(result = check_all_shared_unlocked()) ) {
std::this_thread::yield();
}
return result;
}

// Wait for shared lock to be 0.
void wait_all_shared_unlocked() noexcept {
while (!check_all_shared_unlocked() ) {
std::this_thread::yield();
}
}

// Try to acquire an exclusive lock. It will set exlusive to be 1, and id to be the
// unique thread id.
//
// Will only fail if exclusive lock is obtained by some other thread.
//
// No blocking version is provided because it is non-sense to wait for another
// thread who has already writing permission (although the write may not be finalized,
// but we have to return fail and release all current shared lock to avoid dead lock).
bool try_lock() noexcept {
uint64_t id = utils::get_thread_id();
lock currentlock = lock_.load();
if (currentlock.exclusive == 1) {
// If the same thread called try_lock on already locked mutex,
// it means we have some logic error somewhere.
assert(currentlock.id != id);

return false;
}

bool result = false;
lock newlock { 1, id, 0 };
do {
newlock.shared_count = currentlock.shared_count;
}
while(!(result = lock_.compare_exchange_weak(currentlock, newlock)) && currentlock.exclusive == 0);

return result;
}


// Unlock the exlusive lock. Shall only be called if no writing is done
// on the node (e.g., due to recursive exclusive call failed for parents node.)
void unlock() noexcept {
uint64_t id = utils::get_thread_id();
lock currentlock = lock_.load();
assert(currentlock.exclusive == 1 && currentlock.id == id);

lock newlock { 0, 0, 0 };
do {
newlock.shared_count = currentlock.shared_count;
}
while (lock_.compare_exchange_weak(currentlock, newlock));
}

// Try to convert a shared lock to an exclusive lock.
// If successful, shared lock will be unlocked.
// If failed, nothing will be changed.
bool try_shared_to_exclusive() noexcept {
uint64_t id = utils::get_thread_id();
lock currentlock = lock_.load();
if (currentlock.exclusive == 1) {
assert(currentlock.id != id);
return false;
}

bool result = false;
lock newlock { 1, id, 0 };
do {
assert(currentlock.shared_count > 0);
newlock.shared_count = currentlock.shared_count - 1;
}
while(!(result = lock_.compare_exchange_weak(currentlock, newlock)) && currentlock.exclusive == 0);

return result;
}

// Try to convert an exclusive lock to a shared lock.
// If successful, exclusive lock will be released.
// This function will not fail.
void exclusive_to_shared() noexcept {
uint64_t id = utils::get_thread_id();
lock currentlock = lock_.load();
assert(currentlock.exclusive == 1 && currentlock.id == id);

lock newlock { 0, 0, 0 };
do {
newlock.shared_count = currentlock.shared_count + 1;
}
while (lock_.compare_exchange_weak(currentlock, newlock));
}
};

请先 登录 后评论
  • 0 关注
  • 0 收藏,197 浏览
  • 薛世河 提出于 2019-07-18 07:26

相似问题