Topik temu duga representatif

Apakah yang Berlaku Apabila Anda Menaip URL ke dalam Pelayar?

UmumSukar
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Apakah yang berlaku dari saat pengguna memasukkan https://shop.example/products?id=42#reviews ke dalam bar alamat dan menekan Enter sehingga halaman menjadi kelihatan?

Soalan dan Skop

Apakah yang berlaku dari saat pengguna memasukkan https://shop.example/products?id=42#reviews ke dalam bar alamat dan menekan Enter sehingga halaman menjadi kelihatan? Rangkumi penghuraian URL, resolusi nama, keselamatan sambungan, HTTP, pengendalian bahagian pelayan, navigasi pelayar, dan pemaparan. Terangkan juga peringkat yang boleh dilangkau oleh pengecaman (caching) atau penggunaan semula sambungan.

Mulakan dengan andaian yang jelas supaya jawapan tidak terpesong antara laluan yang tidak serasi. Ini ialah navigasi dokumen peringkat teratas (top-level) yang baharu. Input ialah URL yang lengkap, bukan pertanyaan carian. Tiada service worker yang membekalkan respons, tiada respons HTTP yang cukup segar untuk digunakan secara terus, tiada sambungan serasi yang boleh digunakan semula, hos memerlukan resolusi, dan respons pelayan akhir ialah HTML dengan status 200. Cache hangat (warm caches), lencongan (redirects), dan HTTP/3 menjadi cabang selepas garis dasar tersebut.

Soalan asas rentas lapisan ini sesuai untuk temu duga bahagian belakang (backend), klien, tindanan penuh (full-stack), infrastruktur, SRE, dan kejuruteraan perisian am. Tugasnya adalah untuk menerbitkan laluan sebenar daripada andaian cache dan protokol, kemudian memetakan peringkat rangkaian, pelayan, dan pemaparan kepada bukti yang boleh diperhatikan.

Perkara yang Diuji oleh Penemu Duga

Pertama, bolehkah calon menyatakan andaian sebelum menceritakan sesuatu urutan? Menghafal "DNS, TCP, TLS, HTTP, paparan" terlepas pandang cache, service worker, penggunaan semula sambungan, dan HTTP/3. Laluan sebenar bergantung pada jenis navigasi, keadaan cache, rundingan protokol, dan respons. Jawapan yang kukuh menetapkan satu garis dasar deterministik dan kemudian menamakan syarat yang mengubahnya.

Kedua, bolehkah calon memastikan sempadan protokol tepat? #reviews ialah serpihan URL (fragment) dan dikecualikan daripada sasaran permintaan HTTP. HTTPS mempunyai port lalai 443. DNS menyelesaikan hos tetapi tidak semestinya bermula pada pelayan punca (root server) pada setiap navigasi. HTTP/1.1 dan HTTP/2 biasanya menggunakan TCP; HTTP/3 menggunakan QUIC, yang berjalan di atas UDP dan mengintegrasikan TLS 1.3.

Ketiga, bolehkah calon membezakan komit navigasi, pemuatan sumber, dan piksel pada skrin? Menerima bait pertama tidak menjadikan halaman itu kelihatan, dan melakukan komit pada navigasi tidak bermakna setiap sumber telah dimuatkan. Pelayar masih perlu memilih pemapar (renderer), menghuraikan HTML, menemui sub-sumber, membina DOM dan CSSOM, serta melaksanakan pengiraan gaya, reka letak (layout), lukisan (paint), dan pengkomposisian (compositing).

Keempat, bolehkah calon menggunakan model ini untuk menyahpepijat? Urutan semata-mata tidak dapat menjawab "di manakah ia perlahan?" Jawapan berkualiti tinggi memetakan DNS, sambungan, TLS, bait pertama, muat turun, dan pemaparan urutan utama (main thread) kepada bukti dalam pemasaan navigasi (navigation timing), panel rangkaian, dan surihan prestasi (performance trace).

Soalan untuk Dijelaskan Terlebih Dahulu

  • Adakah input itu pasti merupakan URL? Bar alamat boleh menghantar teks biasa ke enjin carian. Prompt ini membekalkan URL HTTPS yang lengkap dengan skema, jadi teruskan sebagai navigasi.
  • Adakah ini navigasi dokumen atau peralihan SPA dalam aplikasi? Memanggil history.pushState() tidak secara automatik menjalankan navigasi rentas dokumen yang sama. Garis dasarnya ialah dokumen peringkat teratas yang baharu.
  • Adakah ini laluan sejuk (cold) atau hangat (warm)? Cache HTTP dan DNS, service worker, pra-sambung (preconnect), atau sambungan HTTP/2 atau HTTP/3 sedia ada boleh menyingkirkan peringkat tertentu. Terangkan laluan sejuk dahulu, kemudian cabangkannya.
  • Protokol dan persekitaran rangkaian manakah yang terpakai? HTTP/1.1, HTTP/2, dan HTTP/3 mewujudkan sambungan secara berbeza. Proksi, VPN, get laluan perusahaan, atau laluan UDP yang tidak tersedia juga boleh mengubah laluan.
  • Apakah respons yang dikembalikan? Dokumen HTML 200, lencongan, muat turun, ralat sijil, dan kegagalan rangkaian mengambil cabang yang berbeza. Garis dasar menggunakan HTML 200.
  • Apakah yang dimaksudkan dengan "kelihatan"? First paint, largest contentful paint, DOMContentLoaded, dan load ialah pencapaian (milestones) yang berbeza. Jawapan ini mencapai keterlihatan pertama dan kemudian mengambil kira pemuatan seterusnya.

Kerangka Jawapan 30 Saat

"Saya akan mengandaikan navigasi HTTPS peringkat teratas yang sejuk. Pelayar menghuraikan URL dan mengekalkan serpihan di bahagian klien. Ia mendapat alamat daripada cache atau DNS, kemudian menggunakan semula sambungan atau mewujudkan TCP serta TLS untuk HTTP/1.1 atau HTTP/2, atau QUIC dengan TLS 1.3 bersepadu untuk HTTP/3. Ia menghantar laluan dan pertanyaan (query). Selepas menyemak respons dan memilih pemapar, ia mengkomit navigasi. Pemapar menghuraikan HTML, memuatkan sub-sumber, membina DOM, CSSOM, dan pepohon paparan (render tree), kemudian melaksanakan reka letak, lukisan, dan pengkomposisian. Untuk pemuatan yang perlahan, saya mengasingkan masa DNS, sambungan/TLS, TTFB, muat turun, dan urutan utama."

Perincian Langkah demi Langkah

Langkah 1: Klasifikasikan input bar alamat dan huraikan URL

Pelayar terlebih dahulu menentukan sama ada input bar alamat ialah URL yang boleh dinavigasi atau pertanyaan carian. Input ini mengandungi https://, jadi ia dihuraikan sebagai URL. Hasilnya ialah:

KomponenNilaiTujuan
schemehttpsMemilih semantik HTTP selamat dan pengangkutan yang layak
hostshop.exampleDigunakan untuk resolusi nama, sambungan, dan semakan identiti pelayan
port443 (lalai)Dibekalkan oleh skema HTTPS apabila ditinggalkan
path/productsMengenal pasti laluan sumber sasaran
queryid=42Dihantar dalam sasaran permintaan
fragmentreviewsKekal di bahagian klien untuk kedudukan dokumen; dikecualikan daripada sasaran HTTP

Pelayar juga menggunakan peraturan penghuraian dan penormalan Piawaian URL serta menyemak dasar navigasi. Pengendalian pemunggahan (unload handling) halaman lama, dasar keselamatan pelayar, atau URL yang tidak sah boleh mengubah hasil sebelum permintaan rangkaian bermula. Menekan Enter tidak bermaksud paket dihantar serta-merta.

Langkah 2: Tentukan sama ada akses rangkaian boleh dielakkan

Pelayar sebenar mempertimbangkan keadaan dokumen sedia ada, service worker, cache HTTP, keadaan pramuat (preload), dan sambungan yang boleh digunakan semula. Respons cache segar yang terpakai boleh mengelakkan daripada menghubungi pelayan asal (origin). Service worker yang mengawal boleh mengembalikan respons cache, melakukan pengambilan (fetch) sendiri, atau menggabungkan kedua-duanya. Malah capaian cache (cache hit) tidak membuang semua kerja pelayar: HTML yang dikembalikan mungkin masih perlu dihuraikan dan dipaparkan.

Garis dasar mengandaikan tiada satu pun pintasan tersebut boleh membekalkan dokumen, jadi akses rangkaian diteruskan. Elakkan daripada mendakwa satu susunan universal seperti "semak setiap cache, kemudian lakukan DNS." Cache respons, cache DNS, dan kolam sambungan memegang keadaan yang berbeza, dan pelaksanaan pelayar boleh melakukan beberapa kerja secara spekulatif atau selari.

Langkah 3: Selesaikan hos kepada alamat yang boleh dicapai

Pelayar atau sistem pengendalian terlebih dahulu menggunakan hasil resolusi nama yang masih sah. Jika tiada, ia bertanya kepada penyelesai rekursif (recursive resolver) yang dikonfigurasikan. Penyelesai tersebut juga menggunakan cache dan hanya mengikuti delegasi DNS apabila ia tidak mempunyai jawapan, akhirnya mengembalikan rekod alamat yang sesuai. Hasilnya mungkin membawa kepada CDN atau pelayan pinggir dan bukannya pelayan asal aplikasi.

Oleh itu, "pelayar menyoal pelayan punca, domain peringkat teratas (TLD), dan pelayan berwibawa pada setiap pemuatan" adalah tidak tepat. Klien biasanya mewakilkan kerja rekursif kepada penyelesai, manakala cache dan TTL rekod menentukan sama ada pertanyaan lanjut diperlukan. Pelayar juga mungkin menggunakan DNS yang disulitkan. Itu mengubah pengangkutan pertanyaan dan sempadan privasi, bukan matlamat asas untuk memetakan hos kepada alamat perkhidmatan yang boleh dicapai.

Langkah 4: Gunakan semula atau wujudkan sambungan selamat

Dengan alamat calon yang tersedia, pelayar terlebih dahulu cuba menggunakan semula sambungan yang serasi dengan sasaran. Jika tiada yang tersedia, laluan bergantung pada versi HTTP yang dipilih:

  • HTTP/1.1 atau HTTP/2 biasanya mewujudkan TCP dan kemudian melaksanakan jabat tangan TLS. TLS mengesahkan sijil terhadap hos, merundingkan parameter kriptografi, dan boleh menggunakan ALPN untuk memilih HTTP/2 atau HTTP/1.1.
  • HTTP/3 menggunakan QUIC. QUIC berjalan di atas UDP dan mengintegrasikan jabat tangan TLS 1.3 ke dalam pembentukan sambungan, jadi jabat tangan tiga hala TCP bukanlah universal untuk HTTPS.
  • Jika laluan QUIC/UDP yang boleh digunakan tidak tersedia, klien boleh beralih semula (fallback) ke HTTP berasaskan TCP. Dasar perlumbaan (race) dan pengunduran yang tepat ialah perincian pelaksanaan pelayar; jangan reka satu garis masa yang tetap.

Penghalaan IP, pautan tempatan, NAT, proksi, atau VPN semuanya boleh mengambil bahagian dalam menghantar paket. Dalam temu duga dengan masa terhad, akui lapisan tersebut tanpa menghuraikan setiap lompatan (hop) rangkaian melainkan diminta oleh penemu duga.

Langkah 5: Hantar HTTP dan kendalikan respons pelayan

Sebaik sahaja sambungan boleh digunakan, pelayar membina permintaan. Perwakilan teks HTTP/1.1 merangkum semantik penting:

http
GET /products?id=42 HTTP/1.1
Host: shop.example
Accept: text/html

Sasaran permintaan merangkumi laluan dan pertanyaan, bukan #reviews. Pelayar memutuskan sama ada untuk menyertakan setiap kuki mengikut domain, laluan, SameSite, keselamatan, dan peraturan berkaitan, serta boleh menambah medan rundingan kandungan atau pengesahan cache. "Pelayar menghantar semua kuki" adalah terlalu umum. HTTP/2 dan HTTP/3 tidak menggunakan format wayar HTTP/1.1 ini, tetapi kaedah, sasaran, medan, dan semantik respons mempunyai padanan langsung.

Permintaan mungkin sampai ke CDN, proksi terbalik, atau pengimbang beban sebelum aplikasi, cache, dan pangkalan data. Pelayar mudah mungkin menjawab secara terus. Anggap komponen tersebut sebagai seni bina yang mungkin, bukan peringkat wajib. Respons membawa status, medan, dan kandungan. Lencongan memulakan navigasi seterusnya ke arah lokasi baharu. 304 Not Modified bergabung dengan respons cache sedia ada. Garis dasar menerima 200, jenis kandungan HTML, dan badan respons.

Langkah 6: Komit navigasi pelayar

Apabila respons tiba, pelayar mengendalikan status, jenis kandungan, keputusan muat turun, dan dasar keselamatannya, kemudian memilih pemapar yang sesuai untuk destinasi tersebut. Chromium membezakan antara mengkomit navigasi dengan memuatkan dokumen. Komit memindahkan respons kepada pemapar dan menukar pemilikan dokumen semasa; membaca baki dokumen, penghuraian, skrip, dan sub-sumber boleh diteruskan selepas itu.

Status ralat tidak selalu bermaksud "tiada halaman." Respons ralat HTML daripada pelayan boleh menjadi dokumen baharu. Kegagalan sijil, kegagalan sambungan, atau sekatan pelayar sebaliknya boleh menghasilkan halaman ralat yang dijana oleh pelayar. Mengatakan bahawa navigasi hanya dikomit untuk status 200 adalah terlalu mutlak.

Langkah 7: Huraikan, muatkan, dan letakkan piksel pada skrin

Pemapar menghuraikan HTML secara berperingkat ke dalam DOM. Apabila ia menemui lembaran gaya (stylesheets), skrip, fon, imej, dan rujukan lain, ia menjadualkan permintaan sub-sumber. Sumber tersebut boleh menggunakan semula jawapan DNS dan sambungan, atau datang daripada asal (origin) lain yang memerlukan lebih banyak kerja resolusi nama dan sambungan. Setiap sub-sumber tidak semestinya mengulangi urutan jabat tangan penuh.

Menghuraikan CSS menghasilkan CSSOM. DOM dan CSSOM menyumbang kepada pepohon paparan untuk kandungan yang kelihatan, diikuti oleh pengiraan gaya, reka letak, dan lukisan; pelayar kemudian mengkomposisikan lapisan menjadi piksel yang dipaparkan. Skrip klasik tanpa tingkah laku defer, async, atau modul yang sesuai boleh menyekat penghuraian HTML, dan CSS mempengaruhi pemaparan pertama. First paint boleh berlaku sebelum setiap imej atau skrip tak segerak (asynchronous) selesai. DOMContentLoaded juga boleh mendahului penyelesaian load bagi sesetengah sub-sumber.

Serpihan #reviews tidak dihantar ke pelayan. Sebaik sahaja dokumen boleh disasarkan, pelayar boleh menatal ke elemen yang sepadan. Jika skrip mencipta elemen itu kemudian, tingkah laku akhirnya juga bergantung pada kod halaman.

Langkah 8: Diagnosis "perlahan" dengan bukti khusus fasa

Mula-mula tentukan sama ada pengguna melihat kegagalan DNS, kegagalan sambungan, halaman kosong, kandungan lewat, atau interaksi yang disekat. Kemudian petakan simptom kepada peringkat berikut:

PeringkatBukti utamaSempadan tafsiran
DNSdomainLookupStart hingga domainLookupEndResolusi nama yang perlahan tidak membayangkan pelayan aplikasi yang perlahan
SambunganconnectStart hingga connectEnd, termasuk masa sambungan selamatSambungan baharu, laluan rangkaian, atau TLS mungkin mendominasi
TTFBrequestStart hingga responseStartTermasuk transit permintaan, kerja pinggir/pelayan, dan pengembalian bait pertama
Muat TurunresponseStart hingga responseEndSaiz badan, lebar jalur, dan kesesakan semuanya penting
PaparanLukisan, tugasan panjang (long tasks), dan reka letak dalam surihan prestasiPemaparan boleh bertindih dengan muat turun strim; kerja urutan utama mungkin mendominasi

Sesuatu halaman boleh memeriksa rekod navigasinya untuk triaj awal:

js
const [nav] = performance.getEntriesByType("navigation");

console.table({
  dns: nav.domainLookupEnd - nav.domainLookupStart,
  connect: nav.connectEnd - nav.connectStart,
  ttfb: nav.responseStart - nav.requestStart,
  download: nav.responseEnd - nav.responseStart,
  protocol: nav.nextHopProtocol,
});

Perbezaan ini ialah titik pemerhatian, bukan punca utama automatik. Sambungan yang digunakan semula boleh menjadikan beberapa cap masa sama. Service worker, cache, lencongan, atau proksi juga boleh mengubah maksudnya. Sahkan hipotesis dengan panel rangkaian pelayar, surihan bahagian pelayan, dan surihan prestasi dan bukannya menyalahkan pangkalan data setiap kali TTFB tinggi.

Contoh Jawapan yang Kukuh

"Saya akan mentakrifkan garis dasar sejuk: navigasi HTTPS peringkat teratas baharu tanpa respons service worker, capaian cache HTTP, atau sambungan yang boleh digunakan semula, yang berakhir dengan respons HTML 200.

Pelayar menghuraikan https://shop.example/products?id=42#reviews kepada skema HTTPS, hos, port lalai 443, laluan, pertanyaan, dan serpihan. Serpihan kekal di bahagian klien, jadi sasaran permintaan ialah /products?id=42. Pelayar atau OS kemudian menggunakan cache DNS atau bertanya kepada penyelesai rekursif. Penyelesai juga menyimpan cache jawapan, jadi pelayan punca, TLD, dan pelayan berwibawa tidak semestinya dihubungi pada setiap navigasi.

Selepas memperoleh alamat, pelayar terlebih dahulu menyemak sambungan yang boleh digunakan semula. HTTP/1.1 atau HTTP/2 biasanya menggunakan TCP serta TLS dan mengesahkan sijil pelayan. HTTP/3 menggunakan QUIC melalui UDP dengan TLS 1.3 yang disepadukan ke dalam jabat tangan QUIC, jadi saya tidak akan menganggap TCP mandatori untuk setiap permintaan HTTPS. Sebaik sahaja disambungkan, pelayar menghantar GET dengan laluan dan pertanyaan tetapi tanpa serpihan. CDN, pengimbang beban, dan aplikasi mungkin mengendalikannya, atau pelayan mungkin menjawab secara terus, mengembalikan status, medan respons, dan HTML.

Pelayar menyemak jenis respons dan dasar keselamatan, memilih pemapar, dan mengkomit navigasi. Pemapar menghuraikan HTML secara berperingkat ke dalam DOM dan menemui CSS, JavaScript, fon, dan imej. Sumber tersebut boleh menggunakan semula sambungan atau cache. DOM dan CSSOM menyalurkan pepohon paparan, diikuti oleh reka letak, lukisan, dan pengkomposisian. Keterlihatan pertama boleh berlaku sebelum semua sumber selesai, dan pelayar kemudian boleh menggunakan #reviews sebagai sasaran dalam dokumen.

Untuk halaman yang perlahan, saya akan mengumpul bukti mengikut fasa: pemasaan navigasi untuk DNS, sambungan, TTFB, dan muat turun; panel rangkaian untuk protokol, cache, dan lencongan; dan surihan prestasi untuk skrip urutan utama, gaya, reka letak, dan lukisan. Cara itu mengasingkan resolusi nama, masa rangkaian dan pelayan, serta pemaparan pelayar daripada sekadar membaca saluran paip yang tetap."

Kesilapan Lazim

  • Menganggap satu urutan tetap sebagai setiap laluan sebenar → cache, service worker, dan sambungan yang digunakan semula melangkau kerja rangkaian → nyatakan garis dasar sejuk dan kemudian namakan syarat yang memendekkannya.
  • Mendakwa HTTPS sentiasa bermula dengan TCP → HTTP/3 menggunakan QUIC melalui UDP dengan TLS 1.3 bersepadu → asingkan HTTP berasaskan TCP daripada HTTP berasaskan QUIC.
  • Menghantar #reviews ke pelayan → sasaran HTTP mengecualikan serpihan → hantar /products?id=42 dan simpan serpihan di bahagian klien.
  • Mendakwa pelayar menyoal pelayan DNS punca setiap kali → klien, penyelesai rekursif, dan rantaian delegasi semuanya boleh menggunakan cache → terangkan rekursi dan delegasi tanpa mereka-reka urutan pertanyaan mandatori.
  • Mengulangi DNS, TCP, dan TLS untuk setiap sub-sumber → sambungan asal yang sama (same-origin) dan keadaan cache sering kali boleh digunakan semula → tambah kerja hanya untuk asal yang baharu, keadaan lapuk, atau sambungan yang tidak serasi.
  • Menjadikan CDN, perkhidmatan mikro, cache, dan pangkalan data mandatori → topologi pelayan berbeza-beza → sebut "mungkin melalui" dan huraikan hanya untuk seni bina sebenar.
  • Menyamakan HTML yang diterima dengan halaman yang selesai → komit, penghuraian, first paint, DOMContentLoaded, dan load ialah pencapaian yang berbeza → takrifkan titik penyiapan yang sedang dibincangkan.
  • Menamakan protokol tanpa mendiagnosis prestasi → jawapan tidak menunjukkan pertimbangan kejuruteraan → petakan DNS, sambungan, TTFB, muat turun, dan pemaparan kepada bukti yang boleh diperhatikan.

Soalan Susulan

Susulan 1: Apakah yang berubah apabila entri cache HTTP yang segar atau service worker tersedia?

Entri cache yang segar boleh membekalkan respons tanpa menghubungi pelayan asal. Entri yang lapuk mungkin memerlukan permintaan bersyarat dan respons 304. Service worker boleh mengembalikan respons cachenya sendiri, memajukan pengambilan (fetch), atau menggabungkan kedua-duanya. Tanpa mengira sumbernya, pelayar mungkin masih perlu mengkomit, menghuraikan, dan memaparkan dokumen. Nyatakan sumber cache dan keadaan pengesahan dan bukannya mengatakan "cache bermaksud tiada apa-apa yang berlaku."

Susulan 2: Bagaimanakah laluan HTTP/3 berbeza daripada HTTP/2?

HTTP/2 biasanya berjalan di atas TLS pada TCP. HTTP/3 memetakan semantik HTTP kepada QUIC; QUIC berjalan di atas UDP dan mengintegrasikan TLS 1.3. Kedua-duanya menyokong strim serentak pada satu sambungan, tetapi kehilangan pengangkutan untuk satu strim HTTP/3 tidak memaksa strim yang tidak berkaitan menunggu pemulihan satu strim bait TCP. Jika tiada laluan QUIC yang boleh digunakan tersedia, klien boleh menggunakan HTTP berasaskan TCP.

Susulan 3: Langkah manakah yang berulang jika pelayan mengembalikan 301 ke hos lain?

Pelayar memproses lencongan dan Location, menghuraikan URL baharu, dan menggunakan dasar lencongan serta keselamatan. Jika hos baharu tidak mempunyai jawapan DNS yang boleh digunakan atau sambungan yang serasi, resolusi nama dan pembentukan sambungan diperlukan semula; keadaan yang boleh digunakan semula boleh menyingkirkan langkah tersebut. Ia menghantar permintaan lain sehingga ia memperoleh respons akhir atau mencapai had lencongan. Di bawah semantik HTTP, Location tanpa serpihan mewarisi serpihan asal; Location dengan serpihannya sendiri menggunakan serpihan baharu tersebut. Kedua-dua serpihan tidak disertakan dalam sasaran permintaan HTTP.

Susulan 4: DNS dan TTFB adalah pantas, tetapi halaman kekal kosong. Apakah yang anda periksa dahulu?

Bukti rangkaian telah mengecilkan carian. Sahkan bahawa HTML telah tiba dan jenis kandungan atau dasar keselamatan tidak menyekat sumber yang diperlukan. Kemudian periksa surihan prestasi untuk tugasan panjang, skrip segerak, lembaran gaya, fon, dan reka letak yang membebankan. Selaraskan first paint dengan lata sumber kritikal (critical-resource waterfall) dan garis masa urutan utama untuk mencari kebergantungan pertama yang menghalang piksel dipaparkan, dan bukannya mengoptimumkan DNS sekali lagi.

Susulan 5: Mengapakah imej masih boleh hilang selepas DOMContentLoaded?

DOMContentLoaded merangkumi penghuraian dokumen dan skrip penyekat yang berkaitan; ia tidak menunggu setiap imej dan sub-sumber lain. load lebih hampir kepada penyiapan dokumen dan sumber bersandar, tetapi pemuatan malas (lazy loading), pengambilan skrip kemudian, dan kemas kini berterusan masih boleh menyusul. Pilih pencapaian prestasi yang sepadan dengan matlamat yang dapat dilihat oleh pengguna dan bukannya menganggap satu peristiwa sebagai "semuanya telah selesai."

Sumber awam

Soalan berkaitan