En primer lugar, un salario mensual de 30.000 yuanes es demasiado común en BAT, generalmente para puestos de ingeniero senior e ingeniero senior. Es alrededor de p6 en Ali, t5 en Baidu, t2-3 en Tencent, t3-1 en JD y p6 en Meituan. No conozco a los demás. Este nivel es su nivel principal de granjero de código. Trabajan muchas horas extra y pueden resolver la mayoría de los problemas, pero aún necesitan cultivar la capacidad general de la arquitectura del sistema y la capacidad de analizar los cuellos de botella en profundidad.
En segundo lugar, el árbol de habilidades que se domina tiene principalmente tres aspectos: el
primero son los básicos.
Por ejemplo, tiene un conocimiento profundo de las clases de colección, paquetes concurrentes, carga de clases, IO / NIO, JVM, modelos de memoria, genéricos, excepciones, reflexión, etc. Es mejor leer el código fuente para comprender el diseño subyacente. Por ejemplo, las entrevistas generales preguntarán sobre puntos de conocimiento como ConcurrentHashMap, CopyOnWrite, grupo de subprocesos, CAS, AQS, optimización de máquinas virtuales, etc., porque estos son absolutamente importantes para las empresas de Internet. Y la mayoría de la gente no puede pasar este nivel y se quejan de que son inútiles, ¿por qué tienen que entrevistar? Por ejemplo, cuando se usa el grupo de subprocesos, debido a que se usa la cola ilimitada, la capa interna se eleva cuando el servicio remoto es anormal. ¿Cómo solucionarlo? Si ni siquiera conoces el grupo de hilos, ¿cómo puedes jugar? Para dar otro ejemplo, debido a un malentendido de ThreadLocal y su uso para el control seguro de subprocesos, no se logró una seguridad real de subprocesos. Y cómo solucionar problemas de pérdida de memoria y cómo optimizar el rendimiento del sistema. Por lo tanto, como programador de JAVA con 30.000 yuanes, esta base es necesaria.
En segundo lugar, debe tener un conocimiento completo de la tecnología de Internet .
Hablando desde abajo, al menos debe tener un conocimiento profundo de mysql, redis, nginx, tomcat, rpc, jms, etc. Tienes que preguntar cuánto necesitas entender, puedo darte un gran problema. En primer lugar, para MySQL, debe conocer la configuración de los parámetros comunes, cómo elegir el motor de almacenamiento, y también debe comprender los motores de índice comunes y saber cómo elegir. Sepa cómo diseñar tablas, cómo optimizar SQL y cómo ajustar según el plan de ejecución. Para el nivel avanzado, es necesario diseñar y optimizar la sub-base de datos y las sub-tablas. Generalmente, las bases de datos de las empresas de Internet están separadas de la lectura y la escritura, y se dividen vertical y horizontalmente, por lo que este también es un componente experimentado. Entonces redis es casi una habilidad necesaria, y nginx y tomcat son casi necesarios para JAVA Internet. En cuanto al rpc relacionado, hay muchos, varios protocolos de red, tecnologías de serialización, SOA, etc., es necesario tener un conocimiento profundo. Ahora, el marco rpc ampliamente utilizado es dubbo en China. También hay una pila de tecnología relacionada con la nube de primavera que es de código abierto, y puede buscar usted mismo. En cuanto a los relacionados con jms, al menos debes entender el principio. En general, aquellos que no están especializados en el desarrollo de sistemas de middleware y sistemas de soporte no necesitan conocer demasiados detalles. Las empresas nacionales utilizan principalmente activeMQ y kafka. Todo lo que puedes decirme es investigación, y Ali p7 no es demasiado problemático.
El tercero es la capacidad de programación, el pensamiento de programación, la capacidad de algoritmos y la capacidad de arquitectura .
En primer lugar, creo que los programadores de 2W tienen requisitos relativamente bajos para los algoritmos. No importa lo avanzados que sean, son la mayoría de árboles rojo-negro, pero los algoritmos básicos para ordenar y consultar deben ser buenos. El pensamiento de programación es imprescindible. Pregúntale sobre AOP y IOC. Al menos lo tienes claro. El patrón de diseño no dice que hayas usado cada uno de ellos, pero también puedes entender algunos. No creo que sea fácil evaluar la capacidad de programación, pero es fácil clasificar a un usuario de 2000 W por nombre y edad. Por último, está la capacidad arquitectónica. Este tipo de sistema no significa que tengas que diseñar un sistema lo más potente posible. Al menos te permite construir un sistema de picos. Debes tener una idea y una dirección claras.
En vista de los tres puntos anteriores, el editor ha compilado un conjunto completo de notas de estudio de Java, ¡suficiente para que su salario mensual alcance aproximadamente 3W! (¡Para no afectar la experiencia de lectura de todos, el método gratuito para obtener esta nota se encuentra al final del artículo!)
Artículos de JVM
Hilo
Área de memoria JVM ( contador de programa (subproceso privado), pila de máquina virtual (subproceso privado), área de método local (subproceso privado), montón (intercambio de heap-subproceso) -área de datos en tiempo de ejecución, área de método / generación permanente (intercambio de subprocesos)
Memoria en tiempo de ejecución de JVM ( nueva generación, antigua generación, generación permanente )
Recolección de basura y algoritmos ( cómo determinar basura, algoritmo de barrido de marcas (Mark-Sweep), algoritmo de copia (copia), algoritmo de clasificación de marcas (Mark-Compact), algoritmo de recolección generacional )
JAVA cuatro tipos de referencia (referencia fuerte, referencia suave, referencia débil, referencia virtual )
Algoritmo de recopilación generacional de GC VS algoritmo de recopilación de particiones ( algoritmo de recopilación generacional, algoritmo de recopilación de particiones )
Recolector de basura de GC (recolector de basura serial (un solo hilo, algoritmo de copia), recolector de basura ParNew (serial + multihilo), recolector de basura en paralelo (algoritmo de replicación multiproceso, alta eficiencia), recolector Serial Old (algoritmo de clasificación de marcas de un solo subproceso) ), Colector antiguo paralelo (algoritmo de borrado de marcas de subprocesos múltiples), recopilador CMS (algoritmo de borrado de marcas de subprocesos múltiples) )
JAVA IO / NIO ( modelo IO con bloqueo, modelo IO sin bloqueo, modelo IO multiplexado, modelo IO controlado por señal, modelo IO asíncrono, paquete JAVA IO, JAVA NIO, canal, búfer, selector )
Mecanismo de carga de clases de JVM ( carga, verificación, preparación, resolución, referencia de símbolo, referencia directa, inicialización, constructor de clase <cliente>, dispositivo de adición y recorte de clase, delegación de padres, OSGI (sistema de modelo dinámico) )
Colección JAVA
Herencia e implementación de la interfaz
List ( ArrayList (matriz), Vector (implementación de matriz, sincronización de subprocesos), LinkList (lista vinculada) )
Establecer ( HashSet (Hash 表) 、 TreeSet (二叉树) 、 LinkHashSet (HashSet + LinkedHashMap) )
Mapa ( HashMap (matriz + lista vinculada + árbol rojo-negro), ConcurrentHashMap, HashTable (seguro para subprocesos), TreeMap (ordenable), LinkHashMap (orden de inserción de registros) )
Múltiples subprocesos y alta concurrencia
Base de conocimientos concurrente de JAVA
Método de implementación / creación de subprocesos JAVA ( heredando la clase Thread, implementando la interfaz Runnable, ExecutorService, Callable <Class>, subproceso futuro con valor de retorno, basado en el grupo de subprocesos )
4 tipos de grupos de subprocesos ( newCachedThreadPool, newFixedThreadPool, newScheduledThreadPool, newSingleThreadExecutor )
Ciclo de vida del hilo ( nuevo estado (NUEVO), estado listo (RUNNABLE), estado en ejecución (EJECUTANDO), estado bloqueado (BLOQUEADO), muerte del hilo (MUERTO) )
4 formas de terminar el hilo ( fin de la operación normal, use la bandera de salida para salir del hilo, el método de interrupción para terminar el hilo, el método de parada para terminar el hilo (el hilo no es seguro) )
La diferencia entre dormir y esperar
La diferencia entre empezar y correr
Subproceso de fondo JAVA
Bloqueo JAVA (bloqueo optimista, bloqueo pesimista, bloqueo de giro, bloqueo de sincronización sincronizada, ReentrantLock, semáforo semáforo, AtomicInteger, bloqueo reentrante (bloqueo recursivo), bloqueo justo y bloqueo injusto, bloqueo de lectura-escritura ReadWriteLock, bloqueo compartido y exclusivo Cerraduras, cerraduras de peso pesado (Bloqueo Mutex), cerraduras ligeras, cerraduras sesgadas, cerraduras segmentadas, optimización de cerraduras )
Métodos básicos de subproceso ( subproceso en espera (esperar), subproceso inactivo (suspensión), ceder subproceso (rendimiento), interrupción del subproceso (interrumpir), unirse a la espera de que terminen otros subprocesos, ¿por qué usar el método join0 ?, activación del subproceso (notiy), otros métodos )
Cambio de contexto de hilo ( proceso, contexto, registro, contador de programa, PCB- "marco de cambio", actividad de cambio de contexto, causa del cambio de contexto de hilo )
Sincronización y punto muerto
Principio del grupo de subprocesos ( reutilización de subprocesos, composición del grupo de subprocesos, estrategia de rechazo, proceso de trabajo del grupo de subprocesos de Java )
Principio de cola de bloqueo de JAVA ( el método principal de cola de bloqueo, cola de bloqueo en Java, ArrayBlockingQueue (justo, injusto), LinkedBlockingQueue (dos bloqueos independientes para mejorar la concurrencia), PriorityBlockingQueue (compare con la prioridad de implementación de clasificación), DelayQueue (invalidación de caché, tareas de sincronización ), SynchronousQueue (no almacena datos, se puede utilizar para transferir datos), LinkedTransferQueue, LinkedBlockingDeque )
CyclicBarrier. CountDownLatch. Uso de Semaphore
El rol de la palabra clave volátil (visibilidad variable, reordenamiento prohibido)
Cómo compartir datos entre dos hilos
Rol ThreadLocal (almacenamiento local de subprocesos)
La diferencia entre sincronizado y ReentrantLock
ConcurrentHashMap concurrencia ( reducir la granularidad de bloqueo, bloqueo de segmento ConcurrentHashMap )
Programación de subprocesos utilizada en Java ( programación preventiva, programación cooperativa, implementación de la programación de subprocesos JVM (programación preventiva), abandono de la CPU )
Algoritmo de programación de procesos (algoritmo de programación de prioridad, algoritmo de programación de prioridad alta, algoritmo de programación por turnos basado en el intervalo de tiempo )
¿Qué es CAS (mecanismo de bloqueo optimista de comparación e intercambio-giro de bloqueo)?
¿Qué es AQS (Abstract Queue Synchronizer)?
Principios de primavera
Características del resorte ( ligero, inversión de control, orientado al aspecto, contenedor )
Componentes del núcleo del resorte
Módulos comunes de Spring
Paquete principal de primavera
Anotaciones comunes de primavera
Integración de terceros de Spring
Principio de Spring IOC ( concepto, vista de alto nivel del contenedor Spring, implementación del contenedor IOC, alcance de Spring Bean, ciclo de vida de Spring Bean, inyección de dependencia de Spring de cuatro formas, 5 formas diferentes de ensamblaje automático )
Principio Spring APO ( concepto, concepto central AOP, dos modos proxy AOP, principio de realización )
Principio de Spring MVC
Principios de Spring Boot ( crear aplicaciones Spring independientes, Tomcat integrado, no es necesario implementar archivos WAR, simplificar la configuración de Maven, configurar Spring automáticamente, proporcionar funciones listas para producción, como indicadores, controles de estado y configuración externa, absolutamente sin generación de código y XML No se requiere configuración )
Principios de JPA ( transacciones, transacciones locales, transacciones distribuidas, compromiso de dos fases )
Caché de mybatis (primer nivel, segundo nivel)
Arquitectura Tomcat
Artículos de base de datos
Motor de almacenamiento ( concepto, InnoDB (árbol B +), TokuDB (nodo Fratal Tree con datos), MyIASM, memoria )
índice
Base de datos de tres paradigmas . Primer paradigma (las primeras columnas NF no están subdivididas), segundo paradigma (segundo NF: cada tabla solo describe algo, tercer paradigma (tercero NF: no hay dependencia transitiva en columnas de claves no primarias) )
La base de datos es una transacción ( Atomicidad, Consistencia, Aislamiento, Durabilidad )
Procedimientos almacenados (conjunto de sentencias SQL para funciones específicas)
Trigger (un programa que se puede ejecutar automáticamente)
Estrategia de concurrencia de la base de datos ( bloqueo optimista, bloqueo pesimista, marca de tiempo )
Bloqueos de base de datos (bloqueos a nivel de fila, bloqueos a nivel de tabla, bloqueos a nivel de página )
Bloqueo distribuido basado en Redis
Tabla de clasificación ( segmentación vertical (según módulos funcionales), segmentación horizontal (según reglas de almacenamiento) )
Acuerdo de presentación en dos fases ( fase de preparación, fase de presentación, deficiencias )
Protocolo de compromiso trifásico ( fase CanCommit, fase PreCommit, fase doCommit )
Transacción flexible
CAP ( consistencia, disponibilidad, tolerancia de partición )
El contenido de este punto de conocimiento es realmente demasiado y un artículo no se puede escribir en absoluto. Permítanme mostrarles el contenido de esta nota.
Cada parte de esta nota cubre una gran cantidad de contenido, desde básico hasta avanzado. Al mismo tiempo, esta nota tiene casi 1000 páginas, todas las cuales son el resumen de las partes más esenciales del propio autor de la nota. Hoy es un regalo gratis y debe recibirse gratis. Amigo, ayúdame con un clic y tres enlaces a este artículo + sígueme, escanea el código para obtenerlo.