Friday, July 19, 2019

Case study: My Facebook phone screen on July 17. 2019

July 19, 2019

Introduction


It is a good idea to write a case study about my past phone screen from Facebook. I like to document how good the interviewer is to manage the time, expectation, and handle the assessment task in such efficient way.

Case study


I got a call on 10:15 AM, the interviewer introduced himself, what he works on in daily job, and asked a simple question. He told me that he likes to end the interview at 10:56, I checked the time when he said that. It was 10:17. He planned to spend 39 minutes to ask interview algorithm. He will give me five minutes to ask questions.

He copied and pasted the question, and then he said that he will read the problem statement word by word, so he gave me time to read and think about the statement.

I thought about a few minutes, and I shared my idea, he liked my idea. He told me that I could start to write the code. He asked me to think out loud.

The algorithm is not a hard algorithm But I did say that I am thinking about how to determine the position in the array. The interviewer gave me hint right away, but only good enough for me to come out the idea to solve it in less than one line of code.

I finished the coding, and then reviewed my code, I found the code was buggy. I talked about two edge cases. The interviewer gave me second hint what to handle about edge case, I took his advice. I just added a few lines of code.

I checked the time that it is 10:28 or 10:38, so I was asked to solve the second algorithm. I believed that It is a hard level algorithm. And I had ideas how to solve the problem, but I did not have good design for possible issues in my choice.

This is most challenging part of problem solving. I had to learn through how to work with the interviewer, he just quickly gave me all kinds of test cases, helped me to think thoroughly about the problem. I was nervous, but I knew that it is important to listen and think about test cases he gave, and I was so surprised that I came out the idea how to make change of my design.

The interviewer said that he believed that I can code the algorithm if I am given the time. That is wonderful experience.

Actionable Items


I do know that a strong algorithm problem solver can come out the idea in less than five minutes; but it takes me over 20 minutes to work on hard level algorithm, I also need a few hints to change my design.

I think time is so critical in official phone screen. I understand that the interviewer will find out if I can perform under pressure, and how focus I can ...




What is Distributed Caching? Explained with Redis!

Here is the link.


What is Load Balancing?

Here is the link.


Asynchronous Processing in Web Applications, Part 2: Developers Need to Understand Message Queues

Here is the link.


What is a Message Queue and Where is it used?

Here is the link.

Messaging Queues are widely use in asynchronous systems. Message processing in an asynchronous fashion allows the client to relieve itself from waiting for a task to complete and, hence, can do other jobs during that time. It also allows a server to process it's jobs in the order it wants to. Messaging Queues provide useful features such as persistence, routing and task management. We will be discussing the benefits of a message queue in future videos. A system having a message queue can move to higher level requirements while abstracting implementation details of message delivery and event handling to the messaging queue. The 'queue' is just a name for this data structure. In practice, it could be storing messages using any policy. Some examples of message queues are Kafka and RabbitMQ. They are widely used for various purposes such as command query request segregation (CQRS) and event sourcing.

Thursday, July 18, 2019

What is Consistent Hashing and Where is it used?

Here is the link.

Consistent hashing

Here is the wiki article I like to read.

In computer science, consistent hashing is a special kind of hashing such that when a hash table is resized, only  keys need to be remapped on average, where  is the number of keys, and  is the number of slots. In contrast, in most traditional hash tables, a change in the number of array slots causes nearly all keys to be remapped because the mapping between the keys and the slots is defined by a modular operation.
Consistent hashing achieves some of the goals of rendezvous hashing (also called HRW Hashing), which is more general, since consistent hashing has been shown to be a special case of rendezvous hashing. Rendezvous hashing was first described in 1996, while consistent hashing appeared in 1997. The two techniques use different algorithms.

Consistent hashing maps objects to the same cache machine, as far as possible. It means when a cache machine is added, it takes its share of objects from all the other cache machines and when it is removed, its objects are shared among the remaining machines.
The main idea behind the consistent hashing algorithm is to associate each cache with one or more hash value intervals where the interval boundaries are determined by calculating the hash of each cache identifier. (The hash function used to define the intervals does not have to be the same function used to hash the cached values. Only the range of the two functions need match.) If the cache is removed its interval is taken over by a cache with an adjacent interval. All the remaining caches are unchanged.

System Design - Gaurav Sen

Here is the link.


System Design Introduction For Interview.

Here is the link.

System design introduction

A - Ask good questions B - Don't use buzzwords C - Clear and organized thinking D - Drive discussions with 80-20 rule Things to consider Features API Availability Latency Scalability Durability Class Diagram Security and Privacy Cost-effective Concepts to know Vertical vs horizontal scaling CAP theorem ACID vs BASE Partitioning/Sharding Consistent Hashing Optimistic vs pessimistic locking Strong vs eventual consistency RelationalDB vs NoSQL Types of NoSQL Key value Wide column Document-based Graph-based Caching Data center/racks/hosts CPU/memory/Hard drives/Network bandwidth Random vs sequential read/writes to disk HTTP vs http2 vs WebSocket TCP/IP model ipv4 vs ipv6 TCP vs UDP DNS lookup Http & TLS Public key infrastructure and certificate authority(CA) Symmetric vs asymmetric encryption Load Balancer CDNs & Edges Bloom filters and Count-Min sketch Paxos Leader election Design patterns and Object-oriented design Virtual machines and containers Pub-sub architecture MapReduce Multithreading, locks, synchronization, CAS(compare and set) Tools Cassandra MongoDB/Couchbase Mysql Memcached Redis Zookeeper Kafka NGINX HAProxy Solr, Elastic search Amazon S3 Docker, Kubernetes, Mesos Hadoop/Spark and HDFS

System design tips

system design tips 

Here is the link. 


书籍:
每本书看两个月左右的样子,很认真的看的,但是大部分东西消化不了
Operating system - three easy piece-baidu 1point3acres
Designing Data-Intensive Application

课程:
- https://www.hiredintech.com/courses/system-design 
- https://www.educative.io (这个讲的蛮好的, 我看了好多遍)
- https://github.com/donnemartin/system-design-primer(这个基础知识讲的不错, 但是具体例子一般)
- Distributed Systems in One Lesson(Safari上有完整版, 4小时左右, 讲的很好)

Youtube视频:
刷题刷累了, 我就看着这些视频当消遣。。。 蛮有趣的。。 比做题有趣的多。。。. From 1point 3acres bbs
- Scalability Harvard Web Development
- Gaurav Sen
- Tushar Roy - Coding Made Simple
- Tech Dummies - Narendra L
- Coding Tech

微信公众号:
- 架构师之路(强推!!!)
- 51CTO

深入研究了以下几个component:
虽然实际工作中没有怎么用, 但是因为简历里有提到,所以我认真看了官方文档, 设计文档,各种教学视频... 
我主要关注architecture, 而不是api应用。
- Kafka
- Cassandra
- Consul

我自己的系统设计套路:
1. 讨论用户是谁
2. 根据用户讨论feature
3. 问一下系统需要handle 的traffic, 问问需不需要进行计算。 面了8次系统设计,只有roblox 要求计算。其他都不要。。。
4. 根据feature讨论系统需要存储和serve哪些data, 这些data用什么存, 讨论sql/nosql/cache/object storage/hdfs 取舍, 巴拉巴拉。。。
5. 根据数据, 设计service。 画图。
6. work through一个use case, 把所有service连起来, 同时修改刚才画好的图。 比如 做uber eats, 讨论用户要order 一个食物,到餐馆接到订单, 到司机接到订单。。。。 
7. 讨论use case细节, 比如 uber eats司机进入某个区域怎么识别啊, cache里怎么存啊。面试官全程都会drive你的design的, 不会丢你在那里自言自语。
8. 面试官会问, 某些环节挂掉了,怎么处理。 无非就是1. 要么replica, master slave, active-passive 或者 2.周期存snapshot 在磁盘上,然后存action log... 挂了可以重新恢复。。。
9. 一些环节怎么scale... multi instance, partition 这些呗。。 偶尔说说service mesh...

Operating Systems: Three Easy Pieces

Here is the link.


架构师之路,半年文章精选

Here is the link.


Wednesday, July 17, 2019

My vacation day

July 17, 2019

Introduction


It is my vacation day. I had to push myself to go out play tennis and try to get more sports and enjoy outdoor activities.

My plan to lose 10 lbs this summer


I like to work on a plan to lose 10 lbs. I like to experience the joy to play tennis, and actually less worry about my weight, enjoy to get social with a lot of Canadians on tennis court.

I need to get good habit to sleep early


I need to get back to normal sleep to recover my biology clock. It is not healthy to stay and work past 12:00 AM.


Fast money trader Karen Finerman - secure your finance future

Nov. 6, 2019

Introduction


It is my favorite video.  I like to write something to share with my friends in north America, alumni from Shanghai Jiaotong univeristy.

8 minutes video


I love the presentation of 3 minutes. Specially I like to take notes from CNBC TV, the notes are well-written and I like to memorize them as well.

Here is the video.

Start investing today

Finerman says:

How to get started

  • Over time, investing builds wealth
  • Compouding is where real wealth-building difference is made
  • Pick a modest goal to start
  • $50/month equates to just $1.67/day
  • Many plans take small amount of money for no additional fee
Do not make a choice to do it. Just do it. 
  • Develop your investing muscle and you'll want to keep flexing it
  • Add bigger chunks to your investments as you start earning more
Invest in you: Read. Set. Grow. 

Investing tools for success

Top excuses
For not investing 

Top excuses for not investing 
"I'll start to invest when I make more money."

I am always in stock market. 
I love equity exposure. 
Overtime it is the place to be. 
Don't over think it. Really, do not let emotion get to the way. Just do it.

I am too old for this to make a difference. 

  • This is the youngest you'll ever be for the rest of your life - it's never too late to start
  • Sticking your head in the sand is not a plan. 

76. Minimum Window Substring

Here is my discussion post.

It is challenging task to design a sliding window which has intelligent way to keep count all chars in sliding window no matter whether the char is in pattern string t. I choose to write a solution based on the video shared by Daniel Su.
Small case stduy
S = "ACBA", t ="AB",
There is step by step explanation in the above video using the above test case. I also like to explain the design.
About right pointer in sliding window
if the char on position of right pointer has bank value bigger than 0, then the char is counted towards to be one of chars in pattern t. Variable count decrement one, no matter right char is in pattern string t, bank count will always decrement one.
About left pointer in sliding window
It is similar idea to hanlde left pointer. The argument is if bank[leftChar] > 0, then one of chars in pattern string s is removed from sliding window, count variable should decrement one.
Why it is hard level algorithm?
  1. Fact 1:
work on test case
s = "ABBB", t = "ABB", the pattern string may have duplicate chars. So the sliding window should contain all unique chars and also its count for each char. The minimum sliding window should contain all unique chars in pattern string, and also keep at least same count for each char as well.
  1. Fact 2:
    How to determine if the string in sliding window contains (denoted as sw) all chars in pattern string s?
counting sort all chars in sw and s, and then compare each char and its count. This takes O(k) time, k is distinct chars in pattern string t. It can be O(1) time instead.
How to design the technique to make it O(1)?
For example, S = "ACBA", t ="AB".
Char C's bank value from 0 to -1, and then left pointer moves away index = 1, go back to 0. Since C is not in string t, C's bank value will never go beyond 0.
First it is the design in template to document all chars in sliding window using bank array. Even the characters not in pattern string t will be recorded, for characters in pattern string t will be recorded using bank array, since pattern string may have more than one copy of the same char, how to tell which copy of char goes to count of pattern string t.
Next count variable is introduce to keep "the sliding window contains all char and it's count in pattern string t" checking O(1) time.
Five minutes to understand count variable design
It is tough job to design count variable. It took me hours to understand when to increment one to count variable, when to decrement one to count variable.
One thing I can do is to show a simple test case. The solution is not difficult to write at all.
s = "AAB", t = "AB",
I think that the above test case first 'A' is visited, bank['A'] = 1, so count variable should be incremented by one. Second 'A' is visited, bank['A'] = 0, so count variable will not be incremented.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _76_minimum_window_substring_optimal
{
    class Program
    {
        static void Main(string[] args)
        {
        }

        /// <summary>
        /// July 15, 2019
        /// study code
        /// https://www.youtube.com/watch?v=9odu9ImG9oY
        /// </summary>
        /// <param name="s"></param>
        /// <param name="t"></param>
        /// <returns></returns>
        public string MinWindow(string s, string t)
        {
            if (s == null || s.Length == 0 ||
                t == null || t.Length == 0)
            {
                return "";
            }

            var bank = new int[256];
            
            int left = 0;
            int right = 0;
            int count = 0;

            int min = Int32.MaxValue;
            string minString = "";

            var pLength = t.Length;
            var length = s.Length;

            for (int i = 0; i < pLength; i++)
            {
                bank[t[i]]++;
            }

            while (right < length)
            {   
                var rightChar = s[right];
                right++; // always advance one to next iteration 
                if (bank[rightChar] > 0)
                {
                    count++;
                }

                bank[rightChar]--; // always decrement one no matter char is in pattern t or not                              

                // move left pointer until missing one char from string t
                while (count == pLength)
                {
                    var size = right - left;
                    if (min > size)
                    {
                        min = size;
                        minString = s.Substring(left, right - left);
                    }

                    // shift our window
                    var leftChar = s[left];
                    left++;  // always move left pointer
                    bank[leftChar]++; // always increment one no matter char is in pattern t or not                    

                    if (bank[leftChar] > 0) // that means left char is one of chars in pattern, also count as one
                    {
                        count--;
                    }
                }
            }

            return minString;
        }
    }
}


Tuesday, July 16, 2019

54. Spiral Matrix - practice in 2015

Here is my sharing on Leetcode.com.

It is tough job to write a C# solution to go over spiral array to print out all elements in the matrix. I wrote C# solution but I failed multiple test cases, I learned that it is easy to make mistake to count same element twice. Compare to use extra space to mark visit, the solution is prone to the bug for duplicated output.
Also back in 2015, I also need to learn C# better to write more readable code.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _54_Spiral_matrix_2015_June
{
    class Program
    {
        static void Main(string[] args)
        {
        }

        /// <summary>
        /// code written in June 12, 2015
        /// </summary>
        /// <param name="matrix"></param>
        /// <returns></returns>
        public IList<int> SpiralOrder(int[,] matrix)
        {
            IList<int> list = new List<int>();

            int len1 = matrix.GetLength(0);
            int len2 = matrix.GetLength(1);

            int[][] matrix_input = new int[len1][];

            for (int i = 0; i < len1; i++)
                matrix_input[i] = new int[len2];

            for (int i = 0; i < len1; i++)
                for (int j = 0; j < len2; j++)
                {
                    matrix_input[i][j] = matrix[i, j];
                }

            ArrayList al = spiralOrder_2(matrix_input);

            foreach (object s in al)
            {
                list.Add((int)s);
            }
            return list;
        }

        public ArrayList spiralOrder_2(int[][] matrix)
        {
            if (matrix == null || matrix.Length == 0 || matrix[0].Length == 0)
                return new ArrayList();
            return spiralOrder_3(matrix, 0, 0, matrix.Length, matrix[0].Length);
        }

        /**
         * Latest update: June 12, 2015 
         * Leetcode: spiral array
         * http://gongxuns.blogspot.ca/2012/12/leetcode-spiral-matrix.html
         * Test case: 
         * 1. empty array 
         * 2. one element:           1 -
         * 2B. one row : 1 2 --
         * 3. one column : 1 |
         *                 2 |
         * 4. more than 1 row, 
         *    or more than 1 column   
         *     1 2
         *     3 4
         *     output: 1 2 4 3 
         * 5. 3 rows, 3 columns
         *    1 2 3
         *    4 5 6
         *    7 8 9
         *    output: 1 2 3 6 9 8 7 4 5 
         * 
         */
        public ArrayList spiralOrder_3(int[][] matrix, int x, int y, int m, int n)
        {
            ArrayList res = new ArrayList();
            // test case: empty array
            if (m <= 0 || n <= 0) return res;

            // test case 2: one row and one column
            if (m == 1 && n == 1)
            {
                res.Add(matrix[x][y]);
                return res;
            }

            //  row, from left to right 
            for (int i = 0; i < n - 1; i++)
            {
                res.Add(matrix[x][y++]);
            }

            //  column, from top to down
            for (int i = 0; i < m - 1; i++)
            {
                res.Add(matrix[x++][y]);
            }

            // conditional: second row, from right to left 
            if (m > 1)
            {
                for (int i = 0; i < n - 1; i++)
                {
                    res.Add(matrix[x][y--]);
                }
            }

            // conditional: second column, from bottom to top
            if (n > 1)
            {
                for (int i = 0; i < m - 1; i++)
                {
                    res.Add(matrix[x--][y]);
                }
            }

            // test case: one row, 1 2 3, where 1 2 is procesed above and 3 is left for next round 
            // one column:
            if (m == 1 || n == 1)
            {
                ArrayList l = spiralOrder_3(matrix, x, y, 1, 1);

                foreach (object val in l)
                    res.Add((int)val);
            }
            else
            {
                ArrayList l = spiralOrder_3(matrix, x + 1, y + 1, m - 2, n - 2);
                foreach (object val in l)
                    res.Add((int)val);
            }

            return res;
        }    
    }
}


ESL course

学生篇
  什么时候我不再上ESL英语
  Wendy在国内念完初三,被录取到加拿大公立学校读10年。开学第一节ESL英语课,她发现听不懂老师所讲的,虽然在国内学了9年英语,新生水平测试成绩是D,她还是自知之明,主动找老师调低一级,从C级水平开始。上了几天课英语还是听不明白,Wendy再次向老师诉苦,又被调换课程从B级开始,终于,她可以安心坐在课室里。Wendy心里很清楚,英语不行听不懂老师所讲的,上课也是白搭的。第一周结束前,指导老师给了她最新一份课程表,英语降低了级别,其他的课程也相应做了调整,难度降低了。这本来是件开心的事,Wendy却不知从那里道听途说,开始担心自己会不会被迫降低一个年级,变成是8年级的学生。
  看到她传来的新课程表,我知道向她的忧虑是多余的,我向她解释道,ESL的本身课程以及有ESL辅助的课程,不是取决年级而是根据英语整体水平和阅读开发程度而设置的。我指给她看的其他课程编码仍然是10年级的课程:视觉艺术、戏剧和数学。
  我还开玩笑地说,你要感谢老师把你的英语难度一再调低,一方面让你有自信地上课,否则你坐在课室里只会是聋子和哑巴的,你提不起劲头去学习的了;另一方面也让你可以轻松地学英语的同时把精力投入到你不熟悉的其他学科中,4科当中有易有难,齐头并进。
  Wendy开心不到一会儿,她又问:什么时候我才不用上ESL英语,直接读正常英语。我没有直接回答,而是先让她看了我之前写的关于ESL的文章摘要。
  ESL分为五个级别,每一级别内又细分初中高三个阶段:
  一,我们称之为英语初级班,这是很简单的第一级;
  二,日常的英语,这会增加学生日常用的词语、语汇,学习课堂用语、课堂用语;
  三,第三级学校或者功课上面常用的一些英语,会帮助学生在所有科目上英语的应用能力;
  四,具有在英语环境里面的学习技能,为了学生将来要选修学术类课程或者应用型课程做准备;
  五,最高的级别,也有称为英语之桥,因为学校要升大学、大专,需要高水平的英语,所以这个级别的英语课程就是为那些升大学和大专的学生做准确的。

刚抵加拿大,孩子都能够用中文听说会写,但英语的程度有限。英语作为第二语言(Englishas a Second Landguage ,简称ESL)的课程,可以帮助留学[微博]生学习英语,让他们能够同讲英语的同学一起学习全部课程和参与学校生活。
  中学生有哪些 ESL辅助课程? 特别改编的课程有:历史、科学、职业研究、公民,以及其他的必修科目。要留意的地方:
  一,中学ESL辅助课程不是取决年级而是根据英语熟练水平和阅读开发程度所设置
  二,学生可以将多达3堂的ESL课程用来代替他/她毕业文凭所需的必修英语学分
  如何选课每个学校都不一样,学校有一个课程表,列出每个年级可选的课程你要特别留意。详细情况你可以问你的辅导员或者英语老师。
  完了,我告诉Wendy,ESL要上几年?视乎你的学习能力水平,通常三个月后你会发现自己的英语能力有所提高,一年之后,学习上用英语沟通己经畅通。当然,要完成ESL英语课程和辅助性课程,我估计也要二、三年的时间。
  凭兴趣选了课,选错了要多读一年
  Paul是国内高材生,来加拿大读12年级。他听说加拿大高中可以自由选课,去学校报到后自己上网选了慕昧已久的烹饪、木工和汽车修理等应用学科。学校老师告诉他,你这样选课一年后毕业没有问题,Paul一听可以按时毕业,一高兴,没有听下去老师说的下半句话,这种选课有可能读不上他的心仪大学的会计专业。我发现了,马上要他找老师改过来,他拖拉了好几天才去办公室找老师。开学第一周学生调课特别多,轮到他时,己经晚了。他应该选的11年级二门数学、会计、经济己经满额,老师只能安排他下学期再上。这样一来,他有可能要多读一年。我叫他星期一再去找老师,看看有什么补救措施,实在不行也先排在轮候名单上,有可能别的同学再调课他可以补上空缺。这个周末他被父母狠狠地训了一顿。
  我给Paul解释的大意是:
  一,加拿大高中实现的学分制就是用“两条腿走路”来办教育的。学分制的优越性在于学生可根据自己的爱好和未来发展来选课,假如将来你要读理科类大学的,在选学分选修课的时候你就要考虑选学术类的;假如你只是中学毕业后就出来工作,可能就会选择一些实用型技术的系列。为此加拿大很多高中还专门设立了开车驾驶课程,因为在加拿大16岁以上的学生就可以领取驾驶证了,学生可以通过学习驾驶的课程得到学分,其他还包括一些烹调的学分、男孩子做工艺、修理的学分等等。学分制下“两条脚走路”,一条是升学,另一条是就业。学校教会同学做出两种选择所具体的知识。让孩子们能够更好的为自己的未来职业和继续深造的学业做一些规划和设计的,让孩子们在高中阶段里有一种灵活性的选择。因为并非每一个加拿大学生都去读大学,他们可能根据自己不同的兴趣和爱好选择读职业大专或直接就业。学分制“两条脚走路”无形中把学生未来去向做了一个分流。这与中国通过中考[微博]把学生分流有所不同。
  二,每个新生来报到,学习顾问或辅导员都会发一本学校选课指引手册给你,然后他们会教你如何进入学校网站登记,用自己的学生身份号码登录,为自己在新学期里选择要上的课程。所有课程都是用代码的,每个课程都会有5个编号来显示课程的名称、年级和种类,例如9年级的基础数学课 MFN1P, MFN是课程的名称,1代表年级,P表示应用类的。你只要花点时间明白这些代码编号,下次选课你一定会得心应手的。

三,加拿大中学无论哪个省份的中学都会同时提供两套中学课程给他们的学生在中学时期去选择,这个选择是从9、10年级开始,我们把这两套课程分为Applied(应用)和Academy(学术)。应用课程是给那些学生为了满足中学毕业或者进入社区学院(大专)而用,学术课程是为了给那些学生想到大学就读本科而用。教育部门在学校课程代码上会把这些课程分为U课程(申请大学,大专通用),C课程(只可以申请大专),M课程(介乎学术和应用课程之间)。其中M课程在申请大学时限定不能够有多于3门左右。而大学申请时录取办公室只会看学生在中学时期的U课程,大专录取办公室的人会同时看U课程和C课程。
  四,大都数来加拿大读高中的留学生都是为了继续在加拿大读大学,所以对于他们来说,高中课程中学术类的课程,对于中国的留学生来说特别重视。从9、10年级开始选学术类基础课程,到11、12年级选修与大学有关的预科类课程。

来加拿大读高中,除了英语,学习上我们还会遇到什么挑战?选课。在中国学生习惯了教育局统一安排,指定上什么课,就吃“大锅饭”式去上课。但在这里9年级开始的学分制,要学生自己选课,而且越往高年级自己选课责任越大,因为同将来大学专业要求有关系。只不过,如果你是高二才过来,只能专心用“倒计式”方法:大学专业要求什么中学成绩你想尽方法去满足,你基本没有机会享受选课自由的“福利”!

加拿大读高中

Here is the link of article. 

如果是10年级及以前,建议读公校。首先读公校是留学加拿大的特权,去美国读不了。其次加拿大公校教育质量高而且更锻炼人。因为公校里的教育理念与北美大学更接轨,更需要孩子的自我管理能力、和老师同学(同学90%以上是本地人)的沟通能力。公校出来的孩子比一般华人私立国际学校出来的孩子能力更强,在大学更能脱颖而出。公立高中学费一般在12000~15000加元/年。
  如果是12年级(高二毕业读加拿大高三)留学加拿大,我推荐选择比较有声誉,大学招生部门比较认可的私立国际学校就读。因为此时进入公立高中学生会跟不上节奏,而且会出现学分不够的情况,很多会导致无法按时毕业。而进入好的私立国际学校则比较灵活,可以通过补课等方式把学分修完,确保当年毕业。同学中也有一定比例的中国孩子,方便孩子快速融入。私立国际学校一般学费在25000~30000加元/年。
  私立学校推荐
  加拿大新东方国际学院 ( 英文全称:NOIC ACADEMY,简称:NOIC ) 坐落于加拿大安大略省多伦多市,是新东方教育科技集团的海外分校,一所全日制、中高端私立高中。学院提供全方位、一站式、个性化VIP教学服务;将高中学分课程、雅思托福考试、大学申请辅导和社会实践活动实现校内集成。同时,我们还定期邀请北美各个行业的领军人物给学生介绍所在行业的机遇与挑战,引导学生做出正确的专业选择,及早规划职业生涯,获得广博的国际视野,并激励学生努力奋斗。
  私立国际高中的优势
  公立高中主要为本地学生提供服务、班级人数相对较多,对于国际学生会一视同仁,老师不会因为国际学生身份而提供特殊照顾和帮助。国际学生从一种教育体系忽然转变到另一种教育体系环境下学习,会出语言和课程上的不适应,从而面临巨大压力。私立高中在同样的教育环境下,实行的小班授课甚至是一对一,不仅能够满足学生的学习需求,同时在语言和生活上得到帮助,能够在短时间适应当地的学习生活。
  NOIC的最大的特点在于其独创的“一对一导师制”,即每个学生从入学的第一天开始,学校指定一位专职老师担任该同学的导师。导师为每一位学生不仅提供选课,语言培训和大学申请等方面的指导,同时也会为学生提供日常生活方面的帮助,从而使得学生不仅在学业上能够迅速进入状态,同时也能在较短的时间内适应加拿大的生活。导师通过与学生每天的朝夕相处,了解每一位学生的特点,并在日常生活中给予关怀和指导。我们的导师100%具有海外留学的经历,其中不乏多伦多大学教育学博士,硕士,知名大学教授,新东方教育集团培训师。他们对美国和加拿大的教育体系了如指掌。无论是申请材料的准备,还是和大学招生人员的沟通,以及如何在众多的录取通知书中进行选择,我们的老师均积累了丰富的经验,为学生进入理想的大学提供强有力的保障。事实证明,这种保姆式的大学申请辅导,可以将申请过程中的风险降至最低,替广大学生和家长解除后顾之忧。

高中留学加拿大

第一,高中留学加拿大,可以选择公立和私立高中,如果选择公立高中,至少需要读两年才能申请大学,也就是说,很难直接到加拿大读高三课程,如果选择私立高中的大学预备课程,最快一年可以毕业并申请大学。加拿大学校的录取名额有限,申请较晚及时学习优秀也无法获得名额。
第二,无论选择加拿大公立还是私立高中,最好提前半年甚至一年申请,这样对申请人,委托机构都最好,是双赢的结果。
第三,加拿大留学专家杨老师介绍说,学生最好读完高二再走,有些同学读了半个学期,然后就匆匆赴加读语言了,这样的好处是尽早接受正统的优质北美教育,但同样也会损失很多国内的学分,因为如果只上了一个学期,那么高二的学习可能不被加拿大高中认可并被要求在加拿大高中重修。因此建议最好完成了高二课程再走。
第四,如果高二留学加拿大,最好在高一和高二的寒暑假能安排一段强化英语的时间,这样对孩子今后赴加拿大留学很有好处。

ESL

所有申请加拿大公立高中的学生并不需要提供雅思或者托福的成绩,这些学生在入学的时候会 参加教育局安排的语言测试,根据测试的结果来决定自己需要读什么级别的ELS课程。所以这个ESL都是针对母语不是英语的学生而开设的语言课程。
这个测试结果会分为A,B, C,D,E五个等级,这五个等级的课程各有什么作用呢?
A --- 初级英语会话课程: 帮助学生英语入门,协助学生适应新生活
B --- 日常英语课程: 增加学生的英语常用词汇、学习课堂用语
C --- 学校及课业常用英语课程: 提高学生在所有科目上的英语运用能力
D --- 英语学习技巧:为修读学术英语及应用英语做好准备
E --- 英语衔接课程:为升大学以及大专做准备

ESL成绩的评估方面有:课程观察, 课堂参与情况,日常作业,测验和考试, 学生功课检查,做项目,口头与书面报告,段落与作文写作, 小组作业

教育局也会每年12月份,3月份和6月份分别给家长或者监护人寄送ESL的成绩单,方便监护人了解到学生的学习情况。