, but this code // executes before the first paint, when

app

is not yet present. The // classes are added to so styling immediately reflects the current // toolbar state. The classes are removed after the toolbar completes // initialization. const classesToAdd = ['toolbar-loading', 'toolbar-anti-flicker']; if (toolbarState) { const { orientation, hasActiveTab, isFixed, activeTray, activeTabId, isOriented, userButtonMinWidth } = toolbarState; classesToAdd.push( orientation ? `toolbar-` + orientation + `` : 'toolbar-horizontal', ); if (hasActiveTab !== false) { classesToAdd.push('toolbar-tray-open'); } if (isFixed) { classesToAdd.push('toolbar-fixed'); } if (isOriented) { classesToAdd.push('toolbar-oriented'); } if (activeTray) { // These styles are added so the active tab/tray styles are present // immediately instead of "flickering" on as the toolbar initializes. In // instances where a tray is lazy loaded, these styles facilitate the // lazy loaded tray appearing gracefully and without reflow. const styleContent = ` .toolbar-loading #` + activeTabId + ` { background-image: linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%); } .toolbar-loading #` + activeTabId + `-tray { display: block; box-shadow: -1px 0 5px 2px rgb(0 0 0 / 33%); border-right: 1px solid #aaa; background-color: #f5f5f5; z-index: 0; } .toolbar-loading.toolbar-vertical.toolbar-tray-open #` + activeTabId + `-tray { width: 15rem; height: 100vh; } .toolbar-loading.toolbar-horizontal :not(#` + activeTray + `) > .toolbar-lining {opacity: 0}`; const style = document.createElement('style'); style.textContent = styleContent; style.setAttribute('data-toolbar-anti-flicker-loading', true); document.querySelector('head').appendChild(style); if (userButtonMinWidth) { const userButtonStyle = document.createElement('style'); userButtonStyle.textContent = `#toolbar-item-user {min-width: ` + userButtonMinWidth +`px;}` document.querySelector('head').appendChild(userButtonStyle); } } } document.querySelector('html').classList.add(...classesToAdd); })(); Professional Licensing Engineering | app

app

Skip to main content

Professional Licensing

FE and PE Exams/Engineering Licensure Information

The typical process of becoming a professional engineer involves graduating from an accredited program and passing the FE and PE exams.

FE Exam

app highly encourages its students to take the Fundamentals of Engineering (FE) exam. Student study groups have been formed at the initiative of the students for preparation. The app pass-rate is excellent—94 percent of app students who take the FE exam pass on their first attempt.

The , also known as the EIT (Engineering In Training) exam, covers the basics of engineering education. It is advised that an engineer takes this exam while still in school or shortly after graduation—while all the fundamentals of engineering are still “fresh.”


The FE exam is an eight-hour exam with 120 one-point questions in the four-hour morning session and 60 two-point questions in the four-hour afternoon session.

Next FE Exam:
The FE exam will be available every two out of every three months.

PE Exam

The , covers topics more specific to one’s field of expertise. It usually requires four years of experience working as an engineer.

Related Links

  • National Society of Professional Engineers
  • National Council of Examiners for Engineering and Surveying