F1转H1B的Dual-status报税经验
写在前面: 本篇文章不构成任何报税建议,也不承担任何法律责任,仅作为个人经验分享,帮助大家对IRS条款有更好的理解。如有报税咨询必要,请寻求专业人士的帮助,本文作者不能提供也无法构成任何法律意义上的报税建议。本文作于2020年申请2019年tax return期间,所有经验根据Internal Revenue Service(IRS)的官方指导和个人理解写成。
我在美国生活有4年了,已经有两年自己填报个人税表的经验。去年10月(2019年10月)在美国境内激活H1B status,从而从F1 immigration status转换成了H1B immigration status,于是今年报税也折腾看了好久IRS的规定和网上的一些解读,但发现中文的解释比较少也比较难找,所以特此在这里写一下我的总结。
首先,抽中H1B不一定代表在税务上你是可以以Resident Alien(RA)的身份来填报税表,甚至不一定能代表你在年末(H1B status激活的10,11,12月)的报税状态是Resident Alien。如果你能满足IRS关于判断是否是税务状态上的美国居民(a United States resident for tax purposes)的要求,需要满足其规定的Substantial Presense Test(SPT)。
SPT测试
SPT测试是指,对于某一报税年X年,被测试者如果想要被认定为X年tax return用途上的美国居民(包括Resident Alien),需要满足一些以下的测试:
- 在X年连续待满过31天
- 在X, X-1, X-2这三年里,按照如下规则计算的居住日期不少于183天:
- 在X年呆的所有满足SPT计算要求的天数
- 在X-1年呆的所有满足SPT计算要求的天数的 1/3
- 在X-2年呆的所有满足SPT计算要求的天数的 1/6
在IRS规定的不满足SPT计算要求的规定里(见本页中Exempt Individual),明确指出了F1签证的学生所在的天数不能加入SPT的计算(例外参考When a Student is Not Exempt)。
举个例子,如果你2019年从F1转为H1B,并且你在转为H1B前前两年(2018, 2017)是F1,且并不满足F1所呆天数加入SPT计算的例外条件,且你在年末(10,11,12月)并未离开美国,那你按照SPT计算的三年居住天数便是92(2019) + 0(2018) + 0(2017) = 92
天,并未大于183天,所以对于2019年的报税状态,除非你选择使用Dual-status的First Year Choice(FYC)或者是结婚状态的特殊条款(下面均会提到),那么你就只能按照Non-Resident Alien(NRA)的状态来报税。这种情况下,甚至你在2019年的,10月,11月,12月都不可以算作RA的税务状态。下面我会详细介绍这三种选择。
Dual-status按照全年NRA来报税
按照我们在SPT测试章节举的例子,如果你不满足2019年的SPT测试,且你又是单身(下面会讲结婚的情况),那么你在F1到H1B的报税年是不能按照全年RA来报税的。那正确的报税姿势有哪些呢?IRS给出了一个明确的说明,在转身份的dual-status那一年,你可以选择使用1040-NR或者1040-NR-EZ来作为Non-Resident Alien进行报税。如果使用NRA进行报税,且由于你在上一年10月前都是F1状态,所以你可以使用F1 treaty来报税,同时也可以使用州税和地方税的itemized deduction进行联邦税减免,具体请参考IRS关于1040-NR的指导和1040-NR-EZ的指导。根据IRS的指导和我的个人理解,这样报税,是按照全年均为NRA进行报税,包括转为H1B的10,11,12月。
Dual-status的First Year Choice(部分RA,部分NRA)
除了在F1转H1B的Dual-status那一年按照NRA报税外,仍然有Dual-status的First Year Choice(FYC)的选择。FYC简单来说,就是尽管你不满足在F1转H1B的那一年的SPT测试,也能够让你在Dual-status那一年能够一部分时间按照NRA报税,一部分时间按照RA报税。要使用FYC,以在2019年从F1转H1B的Dual-status为例,你需要满足以下条件:
- 满足F1转H1B的下一年也就是2020年的SPT测试。
- 需要2019年连续在美国待满31天。
- 需要2019年在美国待满从条件2里这连续31天的第一天开始到2019年的最后一天的百分之75%的时间。
要满足条件1,你使得2020年的H1B美国居住天数
和2019年的H1B的美国居住天数*1/3
之和大于等于183天。而就算2019年10月份到12月在美国全待满92天,这也仍旧要求你在2020年需要待满至少153天,大概率(考虑COVID-19可能带来的延期)超过了联邦报税的截止日期4月15日,所以要使用FYC,你也必须申请报税延期(File Extension)。
其中,条件2和3的天数的计算都排除签证状态为F1的天数(依据 Days of Presens in the United States),具体例外参见When a Student is Not Exempt.
如果你满足这个条件,也使用FYC进行报税的话,你的报税意义上的RA身份可以从第一个满足上面条件2的连续31天的第一天算起。从那天起,你在税务状态上便是一个Resident Alien,而那天之前,仍旧需要按照NRA来报税。通常如果你F1转H1B的10,11,12月在美国都待满且并未离开美国,那你的residency便是从10月开始
然而个人觉得,在单身状态下使用FYC报税,会增加报税填表的复杂程度,并不会从税率上赚到多少,介绍本篇的目的主要是为结了婚的dual-status taxpayer按照RA来作铺垫。详情请看下面章节。
Dual-status按照全年RA来报税(结婚适用)
这篇如果是单身狗或者在Dual-status那年年底还没结婚的朋友,就不用看了。如果你结婚了,恭喜你,你可以按照RA报税了。如果要按照RA,报税,你需要使用两个条款的结合,使得你能够按照全年RA报税。
第一个条款就是上面提到的FYC,如果选择使用,那你的RA在F1转H1B的Dual-status那一年的第一个连续31天的第一天(如果是上面的例子,便是10月1日)便可以生效,持续到当年年末。
第二个条款便是Nonresident Spouse Treated as a Resident,这个条款规定了:在你的税务年的年末(和上面FYC规定产生的效果相得益彰),你结婚了,并且你们俩其中一个是税务意义上的Resident Alien状态而另外一个配偶是Nonresident Alien的话,你可以把那个Nonresident Alien配偶当作Resident Alien来进行报税。其中,IRS的条款特别说明了,这种情况包括,其中一个配偶在该报税年的年初是Nonresident Alien,年末是Resident Alien,而另外一个配偶在报税年的年末是Nonresident Alien的情况。 如果你选择这样报税的话,你和你的配偶全年都将被看作是RA进行报税,你的worldwide的收入都需要参与报税,而且你们只能选择使用1040表中Married Joint File(MJF)也就是婚后联合报税的方式进行。
举个例子,如果你是2019年从F1到H1B,并且使用了FYC使得你在2019年的年末能够被看作是税务状态上的RA状态,而你又结婚了,你的妻子是F1签证,那你们俩便可以使用Married Joint File的方式按照全年均为RA的状态使用1040表进行报税。
全年RA报税对于某一些在美国的华人来说有很大的好处,第一是RA可以使用的standard deduction会比NRA的州税和地方税抵扣额度要高,且因为必须是Married Joint File,所以税率(根据你们夫妻俩的总收入)相比NRA的single报税可能会低很多。以RA报税,在满足条件下,也可以使用学费减免等额外的NRA不具备的税务优惠。某些情况下,在计算了MSF(Married Separate File)的NRA和MJF的RA后,相差的应缴纳税款可以达到上万块,这可以是一笔很可观的税务节省。当然具体情况要参照你自身的情况决定。
写在最后,重申一下,本篇是基于IRS的官方指导和自身理解写成,不构成税务建议以及并不承担任何法律责任。此外,有一篇个人觉得比较好的报税文章可以参考:几个常见的报税问题
媒体和财富
写在前面:这篇文章作为我近日思考的一些总结,恰当或者偏颇,权当作为一扇窗,照亮那些不可见的黑暗,交换那些闭塞的空气,给笼子里的人带来一些新鲜的见解。想写的实在太多,但写起来着实要费些功夫,所以这里就在暂且写这两点吧。我们需要理解每个人的不同,我们需要去尝试理解以及尊重每一个人的价值观。
媒体
现代中国的绝大部分媒体我更喜称之为”喉舌“,并非讽刺其专业性,反倒是对其发挥自身职能为“稳定社会”作出的专业性的信息传递和引导作出肯定。中国自建国以来的一系列舆论问题的根源并非是这类喉舌媒体的良知缺失,而是出现在舆论市场的专制审查上。这个舆论市场的主调单一之持久,审查之严厉,异议打击之积极,都让其失去了其本身应该有的活力。
世界互联网大潮的掀起,本应该让本身相对封闭且落后的中国国民也接受到各种各样世界的信息,让中国人民更容易接触到这个世界上其他不一样的思想和文化。但自21世纪来中国大肆兴建防火长城1阻断了信息的传播,实施了更为封闭的管理,这对后来的一大批中国青少年的影响,极为深远。
曾经和高中同班同学Luke探讨过,什么样的媒体是好的媒体2,我和他达成的共识是,能够客观地呈现尽量多的各方之言便实属良媒,如若需要表达自己的观点,便需要在明显出标识出,这是作者或者媒体的观点。而如今中国的喉舌媒体大都受制于政府的舆论管制和政府要求的论调统一做不到以上几点,尤其呈现各方之言。这些媒体在我看来,大都可以用“一家之言”一言以蔽之。纵观这类大部分文章,通常信息量有限,但却乐于传达观点。
在这样的“一家之言”薰陶下成长的年轻人甚至一些阅历不够丰富的成年人,很容易缺少对异见的认同能力,在这类非蠢即坏的喉舌媒体们给他们营造的,在某些公共议题上高度统一的舆论环境下,他们会下意识地觉得你的“异见”是错误的并且对异见者极具攻击性,但却基本失去了始终遵循过去曾出现在中国舆论环境下的“大胆质疑,小心求证”抑或是“实事求是”这类良好的品质。而在近10年来的中国,这类公共议题也越来越多,我更喜称之为“倒车”3。错不在受辖制的人民,错在他们生活的舆论和受到的教育,总是让他们把冬天唱成春天。
遇见这类“异见”时,我常做的事情是,先放下自己的价值观,认真聆听别人的想法和意见,尝试去理解不同的想法,如果可以理解再尝试把不同的想法和价值观融合在一起,形成一个包容性更好的,视野更大的价值观。如此反复,便会找到一个最终形态,就如我写在前面的:“我们需要理解每个人的不同,我们需要去尝试理解以及尊重每一个人的价值观”。
财富
最近COVID-19的传播,让股市市场跌宕起伏,很多身边的中国同事似乎觉得嗅到了财富自由的味道。每个人都为之癫狂,日夜操心养老金安置,股市做多做空,好似来自各行各业的人现在都可以化身韭菜收割机收割一大批金钱。
除了担心他们能力不如他们所想之外,我更为这批留存海外的中国高级知识分子高度统一的财富观和成功学感到悲哀。就好似是一堆批量生产的提线木偶,看似每个人都有着自己不同的生活和职业,实际上都是被极为统一的成功标准操控着。一方面是,大部分中国原生家庭从小到大贯穿的金钱至上的教育理念,另一方面是,中国近些年来快速发展带来的贫富差距让曾经穷过又饿过的人民更加仇富又慕富。
众多受过世界级良好教育的工程师,科学家,研究员,博士都开始把人生梦想设定到财务自由,那是当代中国教育极大的失败。
这个世界有很多值得追求的东西,钱只是达成目的的一种工具。可笑且可怜的是,明白自己内心真正想要追求什么,想要保护什么,想要成为什么,是一个能绊倒大部分现代中国人的灵魂问题。然而绝大部分人所想真正追求的,可能压根涉及不到巨额的金钱。所以常常见人紧张又着急地寻求投资建议,我却觉得他们更需要人生建议。幸而父母常常在耳边提醒,年轻的时候要不断学习,不断完善自己,简单的话很多人却都不明白。
最后一句话送给陷在割韭菜的钱眼里跌宕起伏大喜大悲的可怜人吧:
如果你觉得你是割韭菜的人,那你大概率也是别人眼里的韭菜。
1防火长城:https://zh.wikipedia.org/wiki/防火长城
一些想法写在COVID-19
写在前面: 读万卷书不如行万里路,行万里路不如阅人无数。写的每一句话背后都是有着深刻的体会,不要嫌短:每句话都是个思考,每个词都很难。
亲历过或者亲历着03年的SARS,08年的汶川地震,20年的COVID-19和全球股市雪崩,有幸在短短百年的人生里,我看到了并经历了这些,作为一个历史见证者思考着且成长着。
或许病毒和疾病本身并不如想象的可怕,真正可怕的是人类社会的恐惧本身。
因为20-21世纪互联网的诞生和普及,爸妈的教育和精神物质支持,朋友的交流和帮助,我接触到了更大的世界:看到了英国脱欧,川普当选,习近平修宪,香港游行;能随手学习到很多以前要去学校才能学到的科学知识这类真理本身;也看到了灾难下的众生相,看到了一些自然界社会的本质,去思考自己需要追求什么,需要保护什么,需要成为什么。
最近偶然间读了Angela Ahrendts写给儿子的信1,在经历了从09年去七中读书开始的最近十年的处境上的改变,有了好些同感:Confidence,Courage,Conviction这三个词如果真的能做到,这世界上大部分事情都基本都能游刃有余。父母也经常跟我传导类似的教育,我很感激他们的教导。
这个世界这么大,我仍然想去多看看。
1: Angela Ahrendts, A letter to my son: Conviction, confidence, and courage
The Lean Startup Notes
Here are some original words from The lean Startup (Eric Ries) I think these notes should be valuable for future self-review:
- Definition: “A startup is a human institution designed to create a new product or service under conditions of extreme uncertainty.”
- Value VS. Waste: “Lean thinking defines value as providing benefit to the customer; anything else is waste.”
- Truth: “Most of the time customers don’t know what they want in advance. What if a startup simply had offered customers the opportunity to use the product solely on the basis of its proposed features before building anything?”
- Conclusion: “It’s easy to kid yourself about what you think customers want. It’s also easy to learn things that are completely irrelevant. Thus, validated learning is backed up by empirical data collected from real customers.”
Some insights to engineer work
I have already worked at WeRide.ai for nearly 1 year and I thought I need to review the process to record something down for potential future reference.
Some notes I got from work
- Never trust anybody even though yourself. Anybody is not always reliable. We have to assume that everything cannot work and under that circumstance we should ensure program run well.
- Always test the codes before putting it to production. Follow the unit tests and E2E tests. Don’t regard testing as waste of time! Never do that or you will pay more time to repair the bug afterwards.
- If you are a person willing to learn things, it’s none of the work and the manager’s business to do with your growth. To be smart and be hungry to learn, things will pay back.
- Don’t promise the DDL at the exact time you are able to finish. Always lower the expectation to get higher performance from peers and managers.
- Never comment on peers. All things go to things, never the people. Please be sure about the responsibility and try to build your own background and muscle
- Always ask questions. Whenever meet something you are not familiar with, please ask questions, to the right person. There are always people who are more experted than you.
- Leave time for the self-study. That’s very important for lifelong career or business.
- At last, never give up after falling down. Fail hard and try hard. Things pay back in the future.
C++11 New Features
最近因为工作需要,重新看了看C++ 11的特性(C++ Primer)。想做一些笔记,就顺道记在这里,对自己对读者也便于温习。
long long
C++11 定义了long long类型,并规定规范:long long至少比long大。
constexpr 常量
在C++中,存在常量表达式(const expression),用于指哪些值不会改变并且在编译过程就能得到计算结果的表达式
。举几个例子:
1 | const int max_files = 20; // 是常量表达式 |
在一个复杂的工程中,很难分辨一个初始值是否是常量表达式,因此显式地定义constexpr
就很有必要,这样也会在编译阶段强制要求编译器去验证是否是常量类型,且是否由常量表达式初始化。
空指针
得到空指针的几个例子:
1 | int *p1 = nullptr; |
C++11提供nullptr
用于初始化空指针
列表初始化(list initialization)
现在初始化变量可以用以下四种方式:
1 | int units_sold = 0; |
当list initialization用于内置类型的变量时,这种初始化形式在初始化值存在丢失信息的风险时,可以在编译阶段就让编译器报错。
类型别名(type alias)
1 | typedef double wages; |
现在以上两种方法都可以对类型进行别名定义。
auto类型说明符
1 | auto item = val1 + val2; // item初始化为val1和val2相加的结果 |
auto
定义的变量显然必须要有初始值,才能让编译器根据初始值去parse变量类型。
decltype类型指示符
decltype
的作用是选择并返回操作数的数据类型。在这个过程中,编译器分析表达式并得到它的类型,但并不实际计算表达式的值:
1 | const int ci = 0, &cj = ci; |
类内初始值(in-class initializer)
在C++11标准中,允许类内初始值初始化数据成员。没有初始化的成员被默认初始化。
1 | struct Sales_data { |
范围初始化
范围for(range for)语句的语法规则如下:
1 | for (declaration : expression) { |
其中,expression应该是一个序列的类型,declaration部分负责定义一个变量,改变量将被用于访问序列中的基础元素。每次迭代,declaration部分的变量被初始化(默认为拷贝初始化)为expression
部分的下一个元素值。
使用=default
生成默认构造函数
传统的C++ class使用编译默认的合成默认构造函数(synthesized default constructor)来当作一个未定义构造函数的类的默认构造函数。在C++11的新标准中允许使用=default
修饰符来显示指定一个类的默认构造函数。如下:
1 | struct Sales_data { |
shared_ptr类
shared_ptr是一种智能指针(smart pointer)类型。用于管理动态对象。智能指针的行为类似于常规指针,但最重要的区别是其内部对所指向的对象提供一个引用计数且提供根据引用计数自动释放所指对象的功能。
常用的方式:
1 | shared_ptr<int> p3 = make_shared<int>(42); // 42 |
Tensorflow Source Codes Reading Notes
As there are very few Chinese tensorflow source codes annotaions on the Internet, I decided to write the article in Chinese such that more people can know more details about how TensorFlow
works in source codes level.
这篇文章是我在2017年10月21日阅读tensorflow源码时做的笔记,并未是完全为了解释清楚tensorflow的源码实现而撰写,因此如有不准确或者不详尽之处还请谅解。参考的tensorflow的版本是1.3.0。
TensorFlow概览
- TensorFlow其实有两个关键词,一个是Tensor,代表在整个Flow中主要的输入输出类型都是tensor; 还有一个是Flow其实就是意味着一个有向图。所以在TF中的整个计算模式就是围绕算子,数据进行的。算子可以理解成定义好的函数,数据可以理解成函数的输入和输出。一个函数执行完毕后的输出又作为下一步计算的输入,因此各个算子和数据(tensor)之间行程了数据流图。
- 关于怎么构建的这幅图可以移步tensorflow官网解释。
- 下面是一副tensorFlow的计算数据流图(来自于TensorFlow官方教程):
- 上面这幅图中,计算了一个线性模型
$$
y = Wx + b
$$
并通过梯度下降来计算真实分类和实际计算的分类的差距来更新参数W
和b
。
Tensor类
- 根据实验,tensorflow的
placeholder
的type为<class 'tensorflow.python.framework.ops.Tensor'>
. 因此在tensorflow.python.framework.ops
目录下找到了关于tensor
的定义。 tensor
可以理解成一个”多维的list”,该类提供了以下方法的重载:
1 | # List of Python operators that we allow to override. |
- 其中
tensor
类不支持__bool__(self)
以及__nonzero__(self)
的布尔表达式的判断。也不支持__iter__(self)
的迭代方式。如有错误访问均报错。 Tensor
对象提供了一个eval(self, feed_dict=None, session=None)
函数,该函数实则计算生成该tensor实例的算子(operation)所需的全部所需的输入(inputs)。该函数实际调用的session.run()
。对于这里我的理解是,因为每一个tensor或者占位符(placeholder)在tensorflow中都作为实际的图节点来进行表示的,该图是一个类似于拓扑图的有向无环图,因此eval
方法实际上是计算拓扑优先顺序在该tensor之前的所有节点。Tensor
还有一个很重要的属性:_consumers
。该属性记录了后续的所有以当前这个tensor为输入的所有算子。有了这个属性,tensorflow可以比较有效地建立起一个有向图来计算。
Bloomberg On-Campus Interview
First-Round on-campus Interview
- Duplicate an linked list without using extra space(except the usage for duplicated list).
- Duplicate an linked list which has a random pointer
Second-Round on-campus Interview
- Give a string containing alphabet character and a question mark
?
and another dictionary which records what character(s) the question mark?
can be replaced to, and for each replacement, how much you need to pay for this replacement. You need to find given a string whether it can be turned to a palindrome with replacement or not and also return the minimum cost among all the replacement. - Design a register system, where the system provides API like
register
,deregister
andsendConfirmation
. However, due to the event size limit, only some of the registered users can be selected and the users are ranked by their register time. To design such a system to make the best performance.
Hudson River Trading 1st Phone Interview
HRT’s interview mainly focus on C++ and low-level computer knowledge. No algorithm question for core developer postion.
Questions
- Introduce yourself and tell about your most challenging project.
- How
vector
works, what’s the complexity of thepush_back
- How do you find a value in a
vector
, what’s the time complexity. vector
andlinked list
which have better performance on iteration.- when we initialize a
vector
, which part will be stored inheap
and which part will be stored instack
- Descripe how
stack
andheap
works and tell about the difference. - Tell more about the
virtual function
in C++ - What if a parent class pointer points to a child class instance and call the
virtual function
. DNS
usesUDP
orTCP
? when and why?